Cod sursa(job #1918654)

Utilizator LucianTLucian Trepteanu LucianT Data 9 martie 2017 16:22:17
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <bits/stdc++.h>
#define sigma 26
using namespace std;
int op;
char str[25];
struct trie
{
    int cnt,nrfii;
    trie *fiu[sigma];
    trie()
    {
        cnt=nrfii=0;
        memset(fiu,0,sizeof(fiu));
    }
}*root=new trie();
void _insert(trie *nod,char *s)
{
    if(*s=='\n'){
        nod->cnt++;
        return;
    }
    if(nod->fiu[*s-'a']==0)
    {
        nod->fiu[*s-'a']=new trie();
        nod->nrfii++;
    }
    _insert(nod->fiu[*s-'a'],s+1);
}
bool _delete(trie *nod,char *s)
{
    if(*s=='\n'){
        nod->cnt--;
    }
    else if(_delete(nod->fiu[*s-'a'],s+1))
    {
        nod->fiu[*s-'a']=0;
        nod->nrfii--;
    }
    if(!nod->nrfii && !nod->cnt && nod!=root)
    {
        delete nod;
        return true;
    }
    return false;
}
int query(trie *nod,char *s)
{
    if(*s=='\n')
        return nod->cnt;
    if(nod->fiu[*s-'a'])
        return query(nod->fiu[*s-'a'],s+1);
    return 0;
}
int LCP(trie *nod,char *s,int k)
{
    if(*s=='\n' || nod->fiu[*s-'a']==0)
        return k;
    return LCP(nod->fiu[*s-'a'],s+1,k+1);
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    fgets(str,sizeof(str),stdin);
    while(!feof(stdin))
    {
        if(str[0]=='0')
            _insert(root,str+2);
        else if(str[0]=='1')
            _delete(root,str+2);
        else if(str[0]=='2')
            printf("%d\n",query(root,str+2));
        else printf("%d\n",LCP(root,str+2,0));
        fgets(str,sizeof(str),stdin);
    }
    return 0;
}