Advertisement
Guest User

Untitled

a guest
Jun 27th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.02 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. char ALPH[36] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b',
  5.                  'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
  6.                  'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
  7.  
  8.  
  9. typedef struct t_node{
  10.     int CHILD[36];
  11.     unsigned long long mask;
  12. }t_node;
  13.  
  14. t_node m[5001];
  15. int last = 1;
  16. unsigned long long current = 0;
  17. char BUFF[5001];
  18. unsigned int HASH[200];
  19. FILE *f1,*f2;
  20.  
  21.  
  22. void out_tree(const int x)[ //unsigned long long x may be
  23.     static int pos = 0;
  24.     if (pos != 0){
  25.         BUFF[pos] = '\0';
  26.         fprintf(f2, "%s %d\n", BUFF, x-1);
  27.     }
  28.     for (unsigned int i = 0; i < 36; i++){
  29.         if (((m[x].mask >> i) & 1ULL) == 1) {
  30.             BUFF[pos++] = ALPH[i];
  31.             out_tree(m[x].CHILD[i]);
  32.             --pos;
  33.         }
  34.     }
  35. }
  36.  
  37.  
  38. int main() {
  39.     f1 = fopen("input.txt", "r");
  40.     f2 = fopen("output.txt", "w");
  41.     unsigned int n, c;
  42.     for (int i = 0; i < 36; ++i) {
  43.         HASH[ALPH[i]] = i;
  44.     }
  45.     fscanf(f1, "%d", &n);
  46.     unsigned int size;
  47.     char buf[1024];
  48.     while (!feof(f1)){
  49.         size = fread(buf, 1, 1024, f1); //may be in reading
  50.         for (int i = 0; i < size; i++){
  51.             if (isalnum(buf[i])) {
  52.                 if (last - 1 == n) {
  53.                     m[0].mask = 0ULL;
  54.                     current = 0;
  55.                     last = 1;
  56.                 }
  57.                 if (buf[i] == EOF) break;
  58.                 buf[i] = tolower(buf[i]);
  59.                 c = HASH[buf[i]];
  60.                 if ((((m[current].mask) >> c) & 1ULL) == 0) {
  61.                     (m[current].mask) |= (1ULL << c);
  62.                     m[current].CHILD[c] = last;
  63.                     m[last].mask = 0ULL;
  64.                     ++last;
  65.                     current = 0;
  66.                 } else {
  67.                     current = m[current].CHILD[c];
  68.                 }
  69.             }
  70.         }
  71.     }
  72.     out_tree(0);
  73.     fclose(f1);
  74.     fclose(f2);
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement