Pagini recente » Sedinta 2007-11-07 | Sedinta 2007-11-07 | Cod sursa (job #235979)
Cod sursa(job #235979)
#include<stdio.h>
#include<string.h>
struct nod{ char lit;int fr,gr;nod *next[27],*dad;};
nod *root,*paux,*pnew;
int lung,i,ctoi,r;
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;i++)
{ ctoi=(c[i]=='\n')?26:(int)(c[i]-'a');
if(!paux->next[ctoi]){ aloca();paux->next[ctoi]=pnew;pnew->dad=paux;paux->gr++;}
paux=paux->next[ctoi];paux->fr++;
}
}
void D()
{ lung=strlen(c);paux=root;
for(i=0;i<lung;i++)
{ ctoi=(c[i]=='\n')?26:(int)(c[i]-'a');
paux=paux->next[ctoi];
}
for(i=lung-1;i>=0;i--)
{ paux->fr--;r=paux->fr;
paux=paux->dad;
if(r)continue;
ctoi=(c[i]=='\n')?26:(int)(c[i]-'a');
pnew=paux->next[ctoi];
paux->next[ctoi]=0;
delete pnew;
}
}
void N()
{ lung=strlen(c);paux=root;
for(i=0;i<lung;i++)
{ ctoi=(c[i]=='\n')?26:(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;i++)
{ ctoi=(c[i]=='\n')?26:(int)(c[i]-'a');
if(!paux->next[ctoi]||ctoi==26){printf("%d\n",prefix);return;}
paux=paux->next[ctoi];prefix++;
}
}
void aloca()
{
pnew=new nod;
pnew->fr=0;pnew->dad=0;pnew->gr=0;pnew->lit=0;
for(int j=0;j<27;j++)pnew->next[j]=0;
}