Cod sursa(job #2019473)

Utilizator AdrianGotcaAdrian Gotca AdrianGotca Data 7 septembrie 2017 21:17:30
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.37 kb
#include <bits/stdc++.h>
using namespace std;
class Trie{
    public:
        Trie(){
            NumberOfAppearances=0;
            NumberOfSons=0;
            memset(Nodes,'\0',sizeof(Nodes));
        }
        void add(string s,Trie *T){
            if (s.size()==0){
                T->NumberOfAppearances++;
            }
            else {
                int pos=s[0]-'a';
                if (T->Nodes[pos]==0){
                    T->Nodes[pos]=new Trie;
                    T->NumberOfSons++;
                }
                s.erase(s.begin());
                add(s,T->Nodes[pos]);
            }
        }
        int remove(string s,Trie *rad,Trie *T){
            if (s.size()==0){
                T->NumberOfAppearances--;
            }
            else {
                int pos=s[0]-'a';
                s.erase(s.begin());
                if (remove(s,rad,T->Nodes[pos])){
                    T->Nodes[pos]=0;
                    T->NumberOfSons--;
                }
                if (T->NumberOfSons==0&&T->NumberOfAppearances==0&&T!=rad){
                    delete this;return 1;
                }
                return 0;
            }
        }
        int NumberOfWords(string s,Trie *T){
            if (s.size()==0){
                return T->NumberOfAppearances;
            }
            int pos=s[0]-'a';
            if (T->Nodes[pos]){
                s.erase(s.begin());
                return NumberOfWords(s,T->Nodes[pos]);
            }
            return 0;
        }
        int LongestPrefix(string s,int level,Trie *T){
            if (s.size()==0){
                return level;
            }
            int pos=s[0]-'a';
            if (T->Nodes[pos]){
                s.erase(s.begin());
                return LongestPrefix(s,level+1,T->Nodes[pos]);
            }
            return level;
        }
        int NumberOfAppearances;
    private:
        Trie *Nodes[26];
        int NumberOfSons;
};
Trie T;
string cuv;
int op;
int main(){
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    while (cin>>op){
        cin>>cuv;
        switch (op){
            case 0:T.add(cuv,&T);break;
            case 1:T.remove(cuv,&T,&T);break;
            case 2:cout<<T.NumberOfWords(cuv,&T)<<'\n';break;
            case 3:cout<<T.LongestPrefix(cuv,0,&T)<<'\n';break;
        }
    }
}