Cod sursa(job #2019488)

Utilizator AdrianGotcaAdrian Gotca AdrianGotca Data 7 septembrie 2017 21:59:26
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include <fstream>
#include <cstring>

using namespace std;

struct Trie{
    int NumberOfAppeareances;
    int NumberOfSons;
    Trie *Nodes[26];
    Trie(){
        NumberOfAppeareances=0;
        NumberOfSons=0;
        memset(Nodes,NULL,sizeof(Nodes));
    }
};
Trie *T=new Trie;
int op;
void add(Trie *,char []);
int remove(Trie *,Trie *,char[]);
int NumberOfWords(Trie *,char []);
int LongestPrefix(Trie *,char [],int);
char cuv[25];
int main(){
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    scanf("%d %s",&op,cuv);
    while (!feof(stdin)){
        if (op==0){
            add(T,cuv);
        }
        if (op==1){
            remove(T,T,cuv);
        }
        if (op==2){
            printf("%d\n",NumberOfWords(T,cuv));
        }
        if (op==3){
            printf("%d\n",LongestPrefix(T,cuv,0));
        }
        scanf("%d %s",&op,cuv);
    }
}

void add(Trie *T,char s[]){
    if (strlen(s)==0){
        T->NumberOfAppeareances++;
    }
    else {
        int pos=s[0]-'a';
        if (!T->Nodes[pos]){
            T->Nodes[pos]=new Trie;
            T->NumberOfSons++;
        }
        add(T->Nodes[pos],s+1);
    }
}

int remove(Trie *T,Trie *rad,char s[]){
    if (strlen(s)==0){
        T->NumberOfAppeareances--;
    }
    else {
        int pos=s[0]-'a';
        if (remove(T->Nodes[pos],rad,s+1)){
            T->NumberOfSons--;
            T->Nodes[pos]=0;
        }
    }
    if (T->NumberOfAppeareances==0&&T->NumberOfSons==0&&T!=rad){
        delete T;
        return 1;
    }
    return 0;
}

int NumberOfWords(Trie *T,char s[]){
    if (strlen(s)==0){
        return T->NumberOfAppeareances;
    }
    int pos=s[0]-'a';
    if (T->Nodes[pos]){
        return NumberOfWords(T->Nodes[pos],s+1);
    }
    return 0;
}

int LongestPrefix(Trie *T,char s[],int level){
    if (strlen(s)==0){
        return level;
    }
    int pos=s[0]-'a';
    if (T->Nodes[pos]){
        return LongestPrefix(T->Nodes[pos],s+1,level+1);
    }
    return level;
}