Pagini recente » Cod sursa (job #1154484) | Cod sursa (job #882684) | Cod sursa (job #2443945) | Cod sursa (job #1961497) | Cod sursa (job #268006)
Cod sursa(job #268006)
#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;
}