Cod sursa(job #1474441)

Utilizator Tester01tester Tester01 Data 21 august 2015 23:17:49
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.38 kb
#include <bits/stdc++.h>
using namespace std;
const int alpha_size = 26;
int op;
char word[30];
class PrefixTree  {
  public :
           vector <PrefixTree*> son;
           PrefixTree *root;
           int count_words;
           int count_childs;

           PrefixTree(){
             this->count_words=0;
             this->count_childs=0;
             this->son.resize(alpha_size,NULL);
           }

          void pushWord(PrefixTree *node, char *letter){
            if (!isalpha(*letter)) {
              ++node->count_words;
              return;
            }
            if (!node->son[*letter-'a']) {
                    node->son[*letter-'a']=new PrefixTree;
                    ++node->count_childs;
                    }
            pushWord(node->son[*letter-'a'],letter+1);
          }

          bool popWord(PrefixTree* node,char *letter){
            if (!isalpha(*letter)) {
              --node->count_words;
              }
             else {
                if (node->popWord(node->son[*letter-'a'],letter+1)) {
                        --node->count_childs;
                        node->son[*letter-'a']=NULL;
                }
             }
            if (node->count_childs == 0 && node->count_words == 0 && node != root) {
                    delete node;
                    return 1;
                    }
            return 0;
          }

          int getNumberOfWords(PrefixTree* node,char *letter){
           if (!isalpha(*letter)) return node->count_words;
           if (!node->son[*letter-'a']) return 0;
           return getNumberOfWords(node->son[*letter-'a'],letter+1);
          }

          int getLengthOfPrefix (PrefixTree* node, char *letter) {
              if (!isalpha(*letter) || !node->son[*letter-'a'] ) return (letter-word);
              return getLengthOfPrefix(node->son[*letter-'a'],letter+1);
              }
   } Trie;

int main() {
    ifstream cin("trie.in");
    ofstream cout("trie.out");
    cin.tie();
    Trie.root = new PrefixTree;
    while (cin>>op>>word) {
        switch(op){
          case  0 : Trie.pushWord(Trie.root,word); break;
          case  1 : Trie.popWord(Trie.root,word); break;
          case  2 : cout<<Trie.getNumberOfWords(Trie.root,word)<<"\n"; break;
          default : cout<<Trie.getLengthOfPrefix(Trie.root,word)<<"\n"; break;
           }
    }
    return 0;
}