Pagini recente » Cod sursa (job #1803488) | Cod sursa (job #2408545) | Cod sursa (job #490103) | Cod sursa (job #197272) | Cod sursa (job #946108)
Cod sursa(job #946108)
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie
{
int count;
int nrfii;
Trie *f[28];
Trie()
{
count=0;
nrfii=0;
memset(f,0,sizeof(f));
}
} *R=new Trie;
void insert(const char sir[30],int i,Trie *T)
{
if(sir[i]==0)
{
T->count++;
return;
}
if(T->f[sir[i]-'a']==NULL)
{
T->f[sir[i]-'a']=new Trie;
T->nrfii++;
}
insert(sir,i+1,T->f[sir[i]-'a']);
}
int remove(const char sir[30],int i,Trie *T)
{
if(sir[i]==0)
{
T->count--;
if(T->count==0)
{
delete T;
return 1;
}
return 0;
}
if(remove(sir,i+1,T->f[sir[i]-'a']))
{
T->f[sir[i]-'a']=0;
T->nrfii--;
}
if(T->nrfii==0&&T->count==0&&T!=R)
{
delete T;
return 1;
}
return 0;
}
int nr(const char sir[30],int i,Trie *T)
{
if(sir[i]==0)
return T->count;
if(T->f[sir[i]-'a']==NULL)
return 0;
return nr(sir,i+1,T->f[sir[i]-'a']);
}
int pref(const char sir[30],int i,Trie *T)
{
if(sir[i]==0)
return i;
if(T->f[sir[i]-'a']==NULL)
return i;
return pref(sir,i+1,T->f[sir[i]-'a']);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int o;
char w[30];
while(scanf("%d %s",&o,&w)!=EOF)
{
if(o==0)
insert(w,0,R);
else if(o==1)
remove(w,0,R);
else if(o==2)
printf("%d\n",nr(w,0,R));
else
printf("%d\n",pref(w,0,R));
}
return 0;
}