Cod sursa(job #599032)

Utilizator floringh06Florin Ghesu floringh06 Data 27 iunie 2011 20:17:31
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>

using namespace std;

#define MAX_N 26

typedef struct NODE {
    int nWords;
    int nPrefixes;
    NODE *f[MAX_N];      
    
    NODE () {
         nWords = 0;
         nPrefixes = 0;
         memset (f, 0, sizeof (f));
    }
};

NODE* root;

void insertWord (NODE *act, string word, int p) {
     if (p == word.size()) {
           act->nWords++;
           act->nPrefixes++;
     } else {
           act->nPrefixes++;
           
           int i = word[p] - 'a';
           
           if (act->f[i] == NULL)
              act->f[i] = new NODE();
           insertWord (act->f[i], word, p + 1);
     }
}

void deleteWord (NODE *act, string word, int p) {
     if (p == word.size()) {
           --act->nWords;
           --act->nPrefixes;
     } else {
           --act->nPrefixes; 
            
           int i = word[p] - 'a';
           deleteWord (act->f[i], word, p + 1);
     }
}

int countWords (NODE *act, string word, int p) {
    if (p == word.size()) {
          return act->nWords;
    } else {
          int i = word[p] - 'a';
          if (act->f[i] == NULL) return 0;
          
          return countWords(act->f[i], word, p + 1); 
    }
}

int longestPrefix (NODE *act, string word, int p) {
    if (p == word.size()) {
          return p;
    } else {
          int i = word[p] - 'a';
          if (act->f[i] == NULL) return p;
          
          if (act->f[i]->nPrefixes > 0)
              return longestPrefix (act->f[i], word, p + 1);
          else
              return p;
    }
}

int main () {
    freopen ("trie.in", "r", stdin);
    freopen ("trie.out", "w", stdout);
    
    root = new NODE();
    
    int type;
    string line;
    while (scanf ("%d ", &type) != EOF) {
          getline (cin, line);
          
          if (type == 0) insertWord(root, line, 0);
          if (type == 1) deleteWord(root, line, 0);
          if (type == 2) printf ("%d\n", countWords(root, line, 0));
          if (type == 3) printf ("%d\n", longestPrefix(root, line, 0));
    }
    
    return 0;
}