Pagini recente » Istoria paginii runda/pregatire_oji_2013 | Cod sursa (job #969555) | Cod sursa (job #1351702) | Cod sursa (job #91352) | Cod sursa (job #1362467)
#include <cstdio>
#include <cstring>
using namespace std;
int op;
char s[25];
struct Trie
{
int nr,nrfii;
Trie *fii[30];
Trie()
{
nrfii=0;nr=0;
for(int i=0;i<='z'-'a';++i)
fii[i]=NULL;
}
};
Trie *T;
void add(Trie *T,char *s)
{
if(strlen(s)==0)
{
T->nr++;
return;
}
if(T->fii[*s-'a']==NULL)
{
T->fii[*s-'a']=new Trie;
T->nrfii++;
}
add(T->fii[*s-'a'],s+1);
}
void remove(Trie *T,char *s)
{
if(strlen(s)==0)
{
T->nr--;
return;
}
remove(T->fii[*s-'a'],s+1);
if(T->fii[*s-'a']->nrfii==0 && T->fii[*s-'a']->nr==0)
{
T->nrfii--;
T->fii[*s-'a']=NULL;
}
}
int nraparitii(Trie *T,char *s)
{
if(T==NULL)
return 0;
if(strlen(s)==0)
return T->nr;
nraparitii(T->fii[*s-'a'],s+1);
}
int prefix(Trie *T,char *s)
{
if(strlen(s)==0 || T->fii[*s-'a']==NULL)
return strlen(s);
prefix(T->fii[*s-'a'],s+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
T=new Trie;
while(!feof(stdin))
{
scanf("%d %s\n",&op,s);
if(op==0) add(T,s);
if(op==1) remove(T,s);
if(op==2) printf("%d\n",nraparitii(T,s));
if(op==3) printf("%d\n",strlen(s)-prefix(T,s));
}
return 0;
}