Advertisement
cmiN

trie

Jul 2nd, 2012
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. #include <cstdio>
  2. #define nxt (*str - 'a')
  3.  
  4. struct Trie {
  5.     int words, sons;
  6.     Trie* to[26];
  7.     Trie()
  8.     {
  9.         words = sons = 0;
  10.         for (int i = 0; i < 26; i++) {
  11.             to[i] = NULL;
  12.         }
  13.     }
  14. }* root = new Trie;
  15.  
  16. void add(Trie* node, char* str)
  17. {
  18.     if (!(*str)) {
  19.         node->words++;
  20.     } else {
  21.         if (!node->to[nxt]) {
  22.             node->to[nxt] = new Trie;
  23.             node->sons++;
  24.         }
  25.         add(node->to[nxt], str + 1);
  26.     }
  27. }
  28.  
  29. bool rmv(Trie* node, char* str)
  30. {
  31.     if (!(*str)) {
  32.         node->words--;
  33.     } else if (rmv(node->to[nxt], str + 1)) {
  34.         node->to[nxt] = NULL;
  35.         node->sons--;
  36.     }
  37.     if (!node->sons && !node->words && node != root) {
  38.         delete node;
  39.         return 1;
  40.     } else {
  41.         return 0;
  42.     }
  43. }
  44.  
  45. int cnt(Trie* node, char* str)
  46. {
  47.     if (!(*str)) {
  48.         return node->words;
  49.     } else if (node->to[nxt]) {
  50.         return cnt(node->to[nxt], str + 1);
  51.     } else {
  52.         return 0;
  53.     }
  54. }
  55.  
  56. int prf(Trie* node, char* str, int nr)
  57. {
  58.     if (!(*str) || !node->to[nxt]) {
  59.         return nr;
  60.     } else {
  61.         return prf(node->to[nxt], str + 1, nr + 1);
  62.     }
  63. }
  64.  
  65. int main()
  66. {
  67.     int op;
  68.     char str[32];
  69.     freopen("trie.in", "rt", stdin);
  70.     freopen("trie.out", "wt", stdout);
  71.     while (!feof(stdin)) {
  72.         scanf("%d %s\n", &op, str);
  73.         switch (op) {
  74.         case 0:
  75.             add(root, str);
  76.             break;
  77.         case 1:
  78.             rmv(root, str);
  79.             break;
  80.         case 2:
  81.             printf("%d\n", cnt(root, str));
  82.             break;
  83.         case 3:
  84.             printf("%d\n", prf(root, str, 0));
  85.             break;
  86.         }
  87.     }
  88.     fclose(stdin);
  89.     fclose(stdout);
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement