Pagini recente » Cod sursa (job #2801602) | Cod sursa (job #278867) | Cod sursa (job #2220360) | Cod sursa (job #1207038) | Cod sursa (job #412821)
Cod sursa(job #412821)
#include <string.h>
#include <stdio.h>
#define N 100002
int a[N][26],vf=1;
int nr[N];
int tata[N];
void afiseaza()
{int i,j;
printf(" ");
for (i=1;i<=40;i++)
{printf("%3d",i);
}
printf("\n");
for (j=0;j<26;j++)
{printf("%c ",j+'a');
for (i=1;i<=vf;i++)
{printf("%3d",a[i][j]);
}
printf("\n");
}
printf("----------------------------------\n");
}
int main ()
{ int op,i,l,p,flag;
char cuv[50];
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
do
{
scanf("%d %s",&op,cuv);
l=strlen(cuv);
switch(op)
{
case 0://adauga
for (i=0,p=1;i<l;i++)
{ if(a[p][cuv[i]-'a']==0)
{ a[p][cuv[i]-'a']=++vf;
tata[vf]=p;
p=vf;
}
else
{ p=a[p][cuv[i]-'a'];
}
}
nr[p]++;
break;
case 1: //sterge
for (i=0,p=1;i<l;i++)
{ p=a[p][cuv[i]-'a'];
}
nr[p]--;
for (;p!=1;p=tata[p])
{ flag=0;
for (i=0;i<26;i++)
{ if(a[p][i]!=0)
{ flag=1;
break;
}
}
if(flag==0)
{ for (i=0;i<26;i++)
{ if(a[tata[p]][i]==p)
{ a[tata[p]][i]=0;
break;
}
}
}
}
nr[p]--;
break;
case 2: //nr aparitii
for (flag=0,i=0,p=1;i<l;i++)
{ if(a[p][cuv[i]-'a']==0)
{ flag=1;
break;
}
p=a[p][cuv[i]-'a'];
}
if(flag)
{ printf("0\n");
}
else
{ printf("%d\n",nr[p]);
}
break;
case 3: //cel mai lung prefix
for (i=0,p=1;i<l&&a[p][cuv[i]-'a']!=0;i++)
{ p=a[p][cuv[i]-'a'];
}
printf("%d\n",i);
break;
}
// afiseaza();
}
while(!feof(stdin));
return 0;
}