Cod sursa(job #2410796)

Utilizator cyg_TheoPruteanu Theodor cyg_Theo Data 20 aprilie 2019 12:15:39
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#include <cstring>

using namespace std;

const int NR = 27;

struct trie{
    trie *fii[NR];
    int cntp=0;
    int cnt=0;

    trie(){
        for(int i=0;i<NR;++i)
            fii[i]=0;
        cnt=0;
    }
};

trie *root = new trie();

void mod(trie *nod, char *s, int val){
    if(*s==0){
        nod->cnt+=val;
        nod->cntp+=val;
        return;
    }
    nod->cntp+=val;
    if(!nod->fii[s[0]-'a'])
        nod->fii[s[0]-'a']= new trie();

    mod(nod->fii[s[0]-'a'],s+1,val);
}

int find_w(trie *nod,char *s){
    if(*s==0)
        return nod->cnt;
    if(!nod->fii[s[0]-'a'])
        return 0;
    return find_w(nod->fii[s[0]-'a'],s+1);
}

int find_p(trie *nod,char *s,int l){
    if(nod->cntp==0)
        return l-1;
    if(*s==0)
        return l;
    if(!nod->fii[s[0]-'a'])
        return l;
    return find_p(nod->fii[s[0]-'a'],s+1,l+1);
}

int main(){
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int p;
    char s[30];
    while(scanf("%d ",&p)!=EOF){
        gets(s);
        if(p==0)
            mod(root,s,1);
        if(p==1)
            mod(root,s,-1);
        if(p==2)
            printf("%d\n",find_w(root,s));
        if(p==3)
            printf("%d\n",find_p(root,s,0));
    }
    return 0;
}