Pagini recente » Cod sursa (job #1555050) | Cod sursa (job #2165034) | Cod sursa (job #2210563) | Cod sursa (job #1915242) | Cod sursa (job #1553502)
#include<cstdio>
#include<cstring>
using namespace std;
struct trie
{
int sons,nr;
trie *fiu[26];
trie()
{
memset(fiu,NULL,sizeof(fiu));
sons=0;
nr=0;
}
};
trie *t;
int op;
char s[23];
void adauga(char s[])
{
int i,n;
n=strlen(s);
trie *x;
x=t;
for(i=0;i<n;i++)
{
if(x->fiu[s[i]-'a']==NULL)
{
x->sons++;
x->fiu[s[i]-'a']=new trie;
}
x=x->fiu[s[i]-'a'];
}
x->nr++;
}
void sterge(trie *nod,char s[],int ind,int n)
{
if(ind==n)
{
nod->nr--;
return;
}
sterge(nod->fiu[s[ind]-'a'],s,ind+1,n);
if(nod->fiu[s[ind]-'a']->nr==0&&nod->fiu[s[ind]-'a']->sons==0)
{
nod->fiu[s[ind]-'a']=NULL;
nod->sons--;
}
}
int aparitii(char s[])
{
int i,n;
n=strlen(s);
trie *x;
x=t;
i=0;
while(i<n)
{
x=x->fiu[s[i]-'a'];
i++;
}
return x->nr;
}
int prefix(trie *nod,char s[],int ind,int n)
{
if(ind==n||nod->fiu[s[ind]-'a']==NULL)
{
return ind;
}
return prefix(nod->fiu[s[ind]-'a'],s,ind+1,n);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
t=new trie;
while(gets(s))
{
op=s[0]-'0';
strcpy(s,s+2);
if(op==0)
{
adauga(s);
}
if(op==1)
{
sterge(t,s,0,strlen(s));
}
if(op==2)
{
printf("%d\n",aparitii(s));
}
if(op==3)
{
printf("%d\n",prefix(t,s,0,strlen(s)));
}
}
return 0;
}