Pagini recente » Cod sursa (job #332751) | Cod sursa (job #2144575) | Cod sursa (job #1585174) | Cod sursa (job #1025681) | Cod sursa (job #2158080)
#include <cstdio>
#include <cstring>
using namespace std;
struct trie
{
int cnt,nr;
trie *son[30];
trie()
{
cnt=0;
nr=0;
for(int i=0; i<='z'-'a'; ++i)
son[i]=NULL;
}
}*T;
int tip;
char s[25];
void adauga(trie *T,char *s,int l)
{
int c=*s-'a';
if(!l)
{
T->cnt++;
return;
}
if(T->son[c]==NULL)
{
T->son[c]=new trie;
T->nr++;
}
adauga(T->son[c],s+1,l-1);
}
void sterge(trie *T,char *s,int l)
{
if(!l)
{
T->cnt--;
return;
}
int c=*s-'a';
sterge(T->son[c],s+1,l-1);
if(T->son[c]->nr==0 && T->son[c]->cnt==0)
{
T->nr--;
T->son[c]=NULL;
}
}
int nrap(trie *T,char *s,int l)
{
if(T==NULL)
return 0;
if(l==0)
return T->cnt;
nrap(T->son[*s-'a'],s+1,l-1);
}
int prefix(trie *T,char *s,int l)
{
if(l==0 || T->son[*s-'a']==NULL)
return 0;
return 1+prefix(T->son[*s-'a'],s+1,l-1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
T=new trie;
while(!feof(stdin))
{
scanf("%d %s\n",&tip,&s);
if(tip==0)
adauga(T,s,strlen(s));
if(tip==1)
sterge(T,s,strlen(s));
if(tip==2)
printf("%d\n",nrap(T,s,strlen(s)));
if(tip==3)
printf("%d\n",prefix(T,s,strlen(s)));
}
return 0;
}