Cod sursa(job #1553518)

Utilizator danstefanDamian Dan Stefan danstefan Data 19 decembrie 2015 23:08:07
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <bits/stdc++.h>
using namespace std;
const int lun=26;
struct Trie
{
    int val,sons;
    Trie *son[lun];
    Trie()
    {
        int i;
        val=0;
        sons=0;
        for(i=0; i<lun; ++i)son[i]=NULL;
    }
};
Trie *radacina;
string st;
int ce;
void Unu(Trie *nod,int p)
{

    if(p==st.size())
    {
        nod->val++;
        return ;
    }
        int ind=st[p]-'a';
    if(nod->son[ind]==NULL)
        nod->son[ind]=new Trie,nod->sons++;
    Unu(nod->son[ind],p+1);
}
void Doi(Trie *nod,int p)
{
    if(p==st.size())
    {
        nod->val--;
        return ;
    }
        int ind=st[p]-'a';
    Doi(nod->son[ind],p+1);
    if(nod->son[ind]->val==0&&nod->son[ind]->sons==0)nod->son[ind]=NULL,nod->sons--;
}
int Trei(Trie *nod,int p)
{

    if(p==st.size())return nod->val;
        int ind=st[p]-'a';
    if(nod->son[ind]==NULL)return 0;
    return Trei(nod->son[ind],p+1);
}
int Patru(Trie *nod, int p)
{
    int ind=st[p]-'a';
    if(p==st.size()||nod->son[ind]==NULL)return p;
    return Patru(nod->son[ind],p+1);
}
int main()
{
   // freopen("trie.in","r",stdin);
    ifstream f ("trie.in");
        ofstream g ("trie.out");
    radacina=new Trie;
    while(f>>ce>>st)
    {
        if(ce==0)Unu(radacina,0);
        else if(ce==1)Doi(radacina,0);
        else if(ce==2)g<<Trei(radacina,0)<<'\n';
        else g<<Patru(radacina,0)<<'\n';
    }
    return 0;
}