Cod sursa(job #1512467)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 28 octombrie 2015 09:04:21
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct Trie{
    int cnt,nrfii;
    Trie *fiu[26];
    Trie(){
        cnt=nrfii=0;
        memset(fiu,0,sizeof(fiu));
    }
};
Trie *T=new Trie;
char s[30];
void ins(Trie *nod,char *s){
    if(*s==0){
        nod->cnt++;
        return;
    }
    if(nod->fiu[*s-'a']==0){
        nod->fiu[*s-'a']=new Trie;
        nod->nrfii++;
    }
    ins(nod->fiu[*s-'a'],s+1);
}
int del(Trie *nod,char *s){
    if(*s==0)
        nod->cnt--;
    else
        if(del(nod->fiu[*s-'a'],s+1)==1){
            nod->fiu[*s-'a']=0;
            nod->nrfii--;
        }
    if(nod->cnt==0&&nod->nrfii==0&&nod!=T){
        delete nod;
        return 1;
    }
    return 0;
}
int query(Trie *nod,char *s){
    if(*s==0)
        return nod->cnt;
    if(nod->fiu[*s-'a']!=0)
        return query(nod->fiu[*s-'a'],s+1);
    return 0;
}
int prefix(Trie *nod,char *s,int k){
    if(*s==0||nod->fiu[*s-'a']==0)
        return k;
    return  prefix(nod->fiu[*s-'a'],s+1,k+1);
}
int main(){
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int n,op;
    while(gets(s)!=NULL){
        op=s[0]-'0';
        if(op==0)
            ins(T,s+2);
        if(op==1)
            del(T,s+2);
        if(op==2)
            printf("%d\n",query(T,s+2));
        if(op==3)
            printf("%d\n",prefix(T,s+2,0));
    }
    return 0;
}