Cod sursa(job #1379973)

Utilizator DenisacheDenis Ehorovici Denisache Data 6 martie 2015 20:46:21
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
char data[32];
int tipOp;
struct Trie
{
    int nrfii,cnt;
    Trie *fiu[26];
    Trie()
    {
        nrfii=cnt=0;
        memset(fiu,0,sizeof(fiu));
    }
};
Trie *T = new Trie();
void ins(Trie *nod,char *s)
{
    if (*s=='\n')
    {
        nod->cnt++;
        return;
    }
    if (nod->fiu[*s-'a']==0)
    {
        nod->fiu[*s-'a']=new Trie();
        nod->nrfii++;
    }
    ins(nod->fiu[*s-'a'],s+1);
}
bool del(Trie *nod,char *s)
{
    if (*s=='\n')
        nod->cnt--;
    else if (del(nod->fiu[*s-'a'],s+1))
    {
        nod->fiu[*s-'a']=0;
        nod->nrfii--;
    }
    if (nod->cnt==0 && nod->nrfii==0 && nod!=T)
    {
        delete nod;
        return true;
    }
    return false;
}
int que(Trie *nod,char *s)
{
    if (*s=='\n')
        return nod->cnt;
    if (nod->fiu[*s-'a'])
        return que(nod->fiu[*s-'a'],s+1);
    return 0;
}
int pre(Trie *nod,char *s,int k)
{
    if (*s=='\n' || nod->fiu[*s-'a']==0) return k;
    pre(nod->fiu[*s-'a'],s+1,k+1);
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    fgets(data,32,stdin);
    while (!feof(stdin))
    {
        if (data[0]=='0') ins(T,data+2);
        else if (data[0]=='1') del(T,data+2);
        else if (data[0]=='2') printf("%d\n",que(T,data+2));
        else printf("%d\n",pre(T,data+2,0));
        fgets(data,32,stdin);
    }
    return 0;
}