Cod sursa(job #1645447)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 10 martie 2016 12:22:36
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <cstring>
using namespace std;
char v[22];
struct trie
{
    int nrcuv,nrfii;
    trie *fiu[26];
    trie()
    {
      nrcuv=nrfii=0;
      memset(fiu,0,sizeof(fiu));
    }
};
trie *root=new trie;
void add(trie *nod)
{
    for(int i=0;v[i];i++)
    {
        int ch=v[i]-'a';
        if(nod->fiu[ch]==0)
        {
            nod->fiu[ch]=new trie;
            nod->nrfii++;
        }
        nod=nod->fiu[ch];
    }
    nod->nrcuv++;
}
bool del(trie *nod,int i)
{
    if(v[i]==0) nod->nrcuv--;
    else if(del(nod->fiu[v[i]-'a'],i+1))
    {
        nod->fiu[v[i]-'a']=0;
        nod->nrfii--;
    }
    if(nod->nrcuv==0&&nod->nrfii==0&&nod!=root) {delete nod;return 1;}
    return 0;
}
int cnt(trie *nod)
{
    for(int i=0;v[i] ;i++)
    {
        int ch=v[i]-'a';
        if(nod->fiu[ch]==0) return 0;
        nod=nod->fiu[ch];
    }
    return nod->nrcuv;
}
int prefix(trie *nod)
{
    int i;
    for(i=0;v[i];i++)
    {
        int ch=v[i]-'a';
        if(v[i]==0 || nod->fiu[ch]==0) return i;
        nod=nod->fiu[ch];
    }
    return i;
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int ok;
    while(1)
    {
        scanf("%d %s\n",&ok,v);
        if(v[0]==0) break;
        if(ok==0) add(root);
        if(ok==1) del(root,0);
        if(ok==2) printf("%d\n",cnt(root));
        if(ok==3) printf("%d\n",prefix(root));
        memset(v,0,sizeof(v));
    }
}