Cod sursa(job #268006)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 28 februarie 2009 17:17:21
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include<stdio.h>  
#include<string.h>  
struct nod{ int fr;nod *next[26];};  
nod *root,*paux,*pnew;  
int lung,i,ctoi,r,fals(nod *pp);  
char *op,*c;  
void readd(),solve(),A(),D(),N(),P(),aloca();  
int main()  
{  
    readd();  
    solve();  
    return 0;  
}  
void readd()  
{  
    freopen("trie.in","rt",stdin);  
    freopen("trie.out","wt",stdout);  
}  
void solve()  
{       op=new char[35];c=op+2;  
    aloca();root=pnew;  
    while(fgets(op,30,stdin))  
    {  
        if(op[0]=='0'){A();continue;}  
        if(op[0]=='1'){D();continue;}  
        if(op[0]=='2'){N();continue;}  
        if(op[0]=='3') P();  
    }  
}  
void A()  
{ lung=strlen(c);paux=root;  
  for(i=0;i<lung-1;i++)  
  { ctoi=(int)(c[i]-'a');  
    if(!paux->next[ctoi]){ aloca();paux->next[ctoi]=pnew;}  
    paux=paux->next[ctoi];  
  }  
  paux->fr++;  
}  
void D()  
{ int u=0,ci[25];  
  nod *cp[25];  
  lung=strlen(c);paux=root;cp[0]=root;  
  for(i=0;i<lung-1;i++)  
  { ctoi=(int)(c[i]-'a');  
    ci[++u]=ctoi;  
    paux=paux->next[ctoi];  
    cp[u]=paux;  
  }  
  paux->fr--;  
  for(i=u;i;i--)  
  { if(!fals(cp[i]))return;  
    paux=cp[i];  
    pnew=cp[i-1];  
    pnew->next[ci[i]]=0;  
    delete paux;  
  }  
}  
void N()  
{ lung=strlen(c);paux=root;  
  for(i=0;i<lung-1;i++)  
  { ctoi=(int)(c[i]-'a');  
    if(!paux->next[ctoi]){printf("0\n");return;}  
    paux=paux->next[ctoi];  
  }  
  printf("%d\n",paux->fr);  
}  
void P()  
{ int prefix=0;  
  lung=strlen(c);paux=root;  
  for(i=0;i<lung-1;i++)  
  { ctoi=(int)(c[i]-'a');  
    if(!paux->next[ctoi]){printf("%d\n",prefix);return;}  
    paux=paux->next[ctoi];prefix++;  
  }  
  printf("%d\n",prefix);  
}  
void aloca()  
{  
    pnew=new nod;  
    pnew->fr=0;  
    for(int j=0;j<26;j++)pnew->next[j]=0;  
}  
int fals(nod *pp)  
{  
    if(pp->fr)return 0;  
    for(int j=0;j<26;j++)if(pp->next[j])return 0;  
    return 1;  
}