Cod sursa(job #467920)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 1 iulie 2010 13:16:46
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.2 kb
#include<cstdio>
#include<cstring>
#define N 1<<20
#define X 21
#define in freopen("trie.in","r",stdin)
#define out freopen("trie.out","w",stdout)
int n,nrn,ap[N],val[N],tata[N],nrf[N],nr[N][30];
char s[X];

//adauga adf(1,0,strlen(s)-1);
void adf(int nod,int poz,int lung)
{
    if(poz==lung+1)
    {
        ap[nod]++;
        return;
    }
    if(nr[nod][s[poz]-'a'])
        adf(nr[nod][s[poz]-'a'],poz+1,lung);
    else
    {
        nrf[nod]++;
        nr[nod][s[poz]-'a']=++nrn;
        tata[nrn]=nod;
        val[nrn]=s[poz]-'a';
        adf(nr[nod][s[poz]-'a'],poz+1,lung);
    }
}
//sterge sdf(1,0,strlen(s)-1);
void sdf(int nod,int poz,int lung)
{
    if(poz==lung+1)
    {
        ap[nod]--;
        if(nrf[nod]==0 && ap[nod]==0)
        {
            nr[tata[nod]][val[nod]]=0;
            nrf[tata[nod]]--;
            tata[nod]=0;
            val[nod]=0;
        }
        return;
    }
    sdf(nr[nod][s[poz]-'a'],poz+1,lung);
    if(nrf[nod]==0 && ap[nod]==0)
    {
        nr[tata[nod]][val[nod]]=0;
        nrf[tata[nod]]--;
        tata[nod]=0;
        val[nod]=0;
    }
}
//aparitii apdf(1,0,strlen(s)-1);
void apdf(int nod,int poz,int lung)
{
    if(poz==lung+1)
    {
        printf("%d\n",ap[nod]);
        return;
    }
    if(!nr[nod][s[poz]-'a'])
    {
        printf("0\n");
        return;
    }
    apdf(nr[nod][s[poz]-'a'],poz+1,lung);
}
//prefix prdf(1,0,strlen(s)-1);
void prdf(int nod,int poz,int lung)
{
    if(poz==lung+1)
    {
        printf("%d\n",poz);
        return;
    }
    if(!nr[nod][s[poz]-'a'])
    {
        printf("%d\n",poz);
        return;
    }
    prdf(nr[nod][s[poz]-'a'],poz+1,lung);
}


void set(char s[X],char ch)
{
    for(int i=0;i<X;i++)
        s[i]=ch;
}
void read()
{
    char x;
    in;
    out;
    nrn=1;
    s[0]='1';
    while(scanf("%c",&x)!=EOF)
    {
        set(s,'\x0');
        scanf("%s\n",&s);
        if(x=='0')
            adf(1,0,strlen(s)-1);
        if(x=='1')
            sdf(1,0,strlen(s)-1);
        if(x=='2')
            apdf(1,0,strlen(s)-1);
        if(x=='3')
            prdf(1,0,strlen(s)-1);
    }

}
int main()
{
    read();
    return 0;
}