Cod sursa(job #1316674)

Utilizator Eduard6421Eduard Gabriel Eduard6421 Data 13 ianuarie 2015 23:30:15
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<cstdio>
#include<cstring>
using namespace std;
struct Trie{
    int cnt;
    int nrfii;
    Trie *fiu[26];
    Trie(){
        cnt=0;
        nrfii=0;
        for(register int i=0;i<=26;++i)
            fiu[i]=0;
    }
};
Trie *T=new Trie;
void insertWord(Trie *arbtr,char *w) {
    if(*w=='\0'){
        arbtr->cnt++;
        return;
    }
    if(arbtr->fiu[*w-'a']==0){
        arbtr->fiu[*w-'a']=new Trie;
        arbtr->nrfii++;
    }
  insertWord(arbtr->fiu[*w-'a'],w+1);
}
int delete_sq(Trie *arbtr,char *w) {
    if(*w=='\0')
        arbtr->cnt--;
    else if(delete_sq(arbtr->fiu[*w-'a'],w+1)){
            arbtr->fiu[*w-'a']=0;
            arbtr->nrfii--;
         }
    if(arbtr->cnt==0 && arbtr->nrfii==0 && arbtr!=T){
    delete arbtr;
    return 1;
    }
    return 0;
}
int query(Trie *arbtr,char *w){
    if(*w==NULL)
        return arbtr->cnt;
    if(arbtr->fiu[*w-'a'])
        return query(arbtr->fiu[*w-'a'],w+1);
    return 0;
}
int prefix(Trie *arbtr,char *w,int k){
    if(*w==NULL || arbtr->fiu[*w-'a']==0)
        return k;
     return prefix(arbtr->fiu[*w-'a'],w+1,k+1);
}
int main() {
    int op;
    char s[32];
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    while(scanf("%d",&op)!=-1) {
        scanf("%s",s);
          switch(op){
                case 0:insertWord(T,s);
                        break;
                case 1:delete_sq(T,s);
                        break;
                case 2:printf("%d\n",query(T,s));
                        break;
                case 3:printf("%d\n",prefix(T,s,0));
                        break;
        }
    }
return 0;
}