fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. #define MAXWORD 40
  7. #define ALPHABET 26
  8. #define N 50000
  9.  
  10. struct anagramword
  11. {
  12. char word[MAXWORD];
  13. unsigned short histo[ALPHABET];
  14. };
  15.  
  16. // prototype
  17. void pp(struct anagramword *, int );
  18. void func3(struct anagramword *, int, int);
  19. int cmp(unsigned short *, unsigned short *, int );
  20.  
  21.  
  22. void pp(struct anagramword *a, int n)
  23. {
  24. int i;
  25. while (n--)
  26. {
  27. for ( i = 0; i < ALPHABET; ++i)
  28. printf("%d", a->histo[i]);
  29. printf(" word = %s\n", a->word);
  30. ++a;
  31. }
  32. }
  33.  
  34. void func3(struct anagramword *a, int from, int to)
  35. {
  36. int i;
  37. if (from == to)return;
  38. printf("The word \"%s\" %d anagrams : ", a[from].word, to - from);
  39. for ( i = from + 1; i <= to; ++i)
  40. {
  41. printf("%s, ", a[i].word);
  42. }
  43. putchar('\n');
  44. }
  45.  
  46. int cmp(unsigned short *a, unsigned short *b, int n)
  47. {
  48.  
  49. // int i;
  50. // for ( i = 0; i < ALPHABET; ++i)
  51. // printf("%d%d ", a[i], b[i]);
  52. // putchar('\n');
  53.  
  54. while (n--)
  55. {
  56. // printf("a b = %d %d\n", *a,*b);
  57. if (*a < *b)
  58. return -1;
  59. if (*a > *b)
  60. return 1;
  61. ++a;
  62. ++b;
  63. }
  64. return 0;
  65. }
  66.  
  67. int main(int argc, char const *argv[])
  68. {
  69. char buf[100],c;
  70. struct anagramword *data;
  71. struct anagramword tmp;
  72. FILE *fp;
  73. int i, j, k, dataCount;
  74.  
  75. data = (struct anagramword *)malloc(sizeof(struct anagramword) * N);
  76.  
  77. // 1. argv[1]を使い、Textファイルから単語を読み込む
  78. // http://s...content-available-to-author-only...s.jp/~c_cpp_homework/cgi-bin/joyful/joyful.cgi?
  79. // にテキストファイル2つアップしました。本来は一つのファイルですが、容量制限の為、分割してます。
  80.  
  81. // ヒストグラム(histo)をクリア
  82. for ( i = 0; i < N; ++i)
  83. for ( j = 0; j < ALPHABET; ++j)
  84. data[i].histo[j] = 0;
  85.  
  86. fp = fopen(argv[1], "r");
  87. i = 0;
  88. while ((fgets(buf, 100, fp)) != NULL)
  89. {
  90. buf[strlen(buf) - 1] = '\0';
  91.  
  92. // printf("%d %s\n", i, buf);
  93.  
  94. // 2. 挿入ソートを使って、下記のような構造体に保管する
  95. // struct anagramword {
  96. // char word[MAXWORD];
  97. // unsigned short histo[ALPHABET];
  98. // };
  99.  
  100. sprintf(data[i].word, "%s", buf);
  101.  
  102. for ( j = 0; buf[j]; ++j)
  103. {
  104. c = tolower(buf[j]);
  105. if ((c >= 'a') && (c <= 'z'))
  106. data[i].histo[c - 'a']++;
  107. }
  108.  
  109. for ( j = 0; j < i; ++j)
  110. if (cmp(data[j].histo, data[i].histo, ALPHABET) == 1)break;
  111.  
  112. if (j < i) /* swap & shift */
  113. {
  114. tmp = data[i];
  115. for ( k = i; k > j; --k)
  116. data[k] = data[k - 1];
  117. data[j] = tmp;
  118. }
  119. ++i;
  120. }
  121. dataCount = i;
  122. // printf("dataCount = %d\n", dataCount);
  123.  
  124. // 3. データをもとにアナグラムとその数を記したリストをtxtに出力
  125. // 例)
  126. // The word "ATM" 4 anagrams : ATM’s mast mat’s mats
  127. // The word "evkl" 4 anagrams : evil, live, veil, vile
  128. // …
  129.  
  130. // pp(data, dataCount);
  131.  
  132. int max = 0, maxi;
  133. {
  134. int from = 0;
  135. for ( i = 0; i < dataCount - 1; ++i)
  136. {
  137. if (cmp(data[i].histo, data[i + 1].histo, ALPHABET) == 0)
  138. {
  139. continue;
  140. }
  141. func3(data, from, i);
  142. if (max < i - from)
  143. {
  144. max = i - from;
  145. maxi = from;
  146. }
  147. from = i + 1;
  148. }
  149. func3(data, from, i);
  150. if (max < i - from)
  151. {
  152. max = i - from;
  153. maxi = from;
  154. }
  155. }
  156.  
  157. // 4.最大値を持ったアナグラムとその最大値を出力
  158. printf("最大値を持ったアナグラム = %s, 最大値 = %d\n" , data[ maxi].word , max);
  159.  
  160. return 0;
  161. }
  162.  
Runtime error #stdin #stdout 0.02s 6300KB
stdin
Standard input is empty
stdout
Standard output is empty