Cod sursa(job #430651)

Utilizator borsoszalanBorsos Zalan borsoszalan Data 31 martie 2010 11:13:57
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include<stdio.h>
#include<string.h>


struct trie
{
    int cnt,nrfii;
    trie *fiu[26];
    trie()
    {
        nrfii=cnt=0;
        memset(fiu,0,sizeof(fiu));
    }
};

trie *T=new trie;
char S[25];

void ins(trie *nod,char *s)
{
	int aux=(int)*s-'a';
    if (*s=='\n')
    {
        nod->cnt++;
        return ;
	}
    if (nod->fiu[aux]==0)
	{
        nod->fiu[aux]=new trie;
        nod->nrfii++;
	}
    ins(nod->fiu[aux],s+1);
}

int del(trie *nod,char *s)
{
	int aux=(int)*s-'a';
    if (*s=='\n')
        nod->cnt--;
    else
    if (del(nod->fiu[aux],s+1))
	{
        nod->nrfii--;
	}
    if(nod->nrfii==0 && nod!=T && nod->cnt==0)
	{
        delete nod;
        return 1;
	}
    return 0;
}

int que(trie *nod,char *s)
{
	int aux=(int)*s-'a';
    if (*s=='\n')
        return nod->cnt;
    if (nod->fiu[aux])
        return que(nod->fiu[aux],s+1);
    return 0;
}

int pre(trie *nod,char *s,int k)
{
	int aux=(int)*s-'a';
    if (*s=='\n' || !nod->fiu[aux])
        return k;
    return pre(nod->fiu[aux],s+1,k+1);
}

int main()
{

    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    fgets(S,25,stdin);
    while(!feof(stdin))
        {
        if (S[0]=='0')
            ins(T,S+2);
        else if (S[0]=='1')
            del(T,S+2);
        else if (S[0]=='2')
            printf("%d\n",que(T,S+2));
		else printf("%d\n",pre(T,S+2,0));
        fgets(S,25,stdin);
        }
    return 0;
}