Pagini recente » Cod sursa (job #2950712) | Cod sursa (job #460623) | Cod sursa (job #3224390) | Cod sursa (job #2810831) | Cod sursa (job #1990272)
#include <cstdio>
FILE *g=fopen("trie.out","w");
struct trie
{
int nf,inf;
trie *fiu[26];
};
void put_in_trie(char s[],trie *t)
{
int i,cc,j;
trie *nodc=t;
for(i=0;s[i];i++)
{
cc=s[i]-'a';
if(nodc->fiu[cc]) nodc=nodc->fiu[cc];
else
{
nodc->fiu[cc]=new trie;
nodc->nf++;
nodc=nodc->fiu[cc];
nodc->nf=0;
nodc->inf=0;
for(j=0;j<=25;j++)nodc->fiu[j]=NULL;
}
}
nodc->inf++;
}
void sterge(char s[],trie *t)
{
trie *traseu[30],*nodc=t;
int i,cc;
for(i=0;s[i];i++)
{
cc=s[i]-'a';
nodc=nodc->fiu[cc];
traseu[i]=nodc;
}
i--;
traseu[i]->inf--;
while(i>0&&traseu[i]->inf==0&&traseu[i]->nf==0)
{
delete traseu[i];
traseu[i-1]->nf--;
traseu[i-1]->fiu[s[i]-'a']=NULL;
i--;
}
}
void nrap(char s[],trie *t)
{
trie *traseu[30],*nodc=t;
int i,cc;
for(i=0;s[i];i++)
{
cc=s[i]-'a';
if(nodc->fiu[cc])
nodc=nodc->fiu[cc];
else
{
fprintf(g,"0\n");
return;
}
traseu[i]=nodc;
}
i--;
fprintf(g,"%d\n",traseu[i]->inf);
}
void longestpref(char s[],trie *t)
{
trie *nodc=t;
int i,cc;
for(i=0;s[i];i++)
{
cc=s[i]-'a';
if(nodc->fiu[cc])
nodc=nodc->fiu[cc];
else
break;
}
fprintf(g,"%d\n",i);
}
int main()
{
trie *t;
t=new trie;
int op;
t->nf=0;
t->inf=0;
int i;
for(i=0;i<=25;i++)t->fiu[i]=NULL;
FILE *f=fopen("trie.in","r");
char s[25];
while(1)
{
int q=fscanf(f,"%d%s",&op,s);
if(q<=0)break;
if(op==0)put_in_trie(s,t);
if(op==1)sterge(s,t);
if(op==2)nrap(s,t);
if(op==3)longestpref(s,t);
}
return 0;
}