Pagini recente » Cod sursa (job #287272) | Cod sursa (job #1786309) | Cod sursa (job #2161965) | Cod sursa (job #3184701) | Cod sursa (job #1354127)
#include <cstdio>
#include <cstring>
using namespace std;
struct Trie
{
Trie *fii[31];
int ap;
int nr_fii;
Trie ()
{
nr_fii=0;
ap=0;
for (int i=0; i<26; i++) fii[i]=NULL;
}
};
Trie *t=new Trie;
int i,op,baa,Max;
char s[30];
inline void upd(Trie *t,char *s)
{
if(strlen(s)==0)
{
t->ap+=baa;
return;
}
if(t->fii[s[0]-'a']==NULL)
{
t->nr_fii++;
t->fii[s[0]-'a']=new Trie;
}
upd(t->fii[s[0]-'a'], s+1);
if(baa==-1)
{
if (t->fii[s[0]-'a']->ap==0 && t->fii[s[0]-'a']->nr_fii==0)
{
t->fii[s[0]-'a']=NULL;
t->nr_fii--;
}
}
}
inline void apar(Trie *t,char *s)
{
if(strlen(s)==0)
{
printf("%d\n",t->ap);
return;
}
if(t->fii[s[0]-'a']==NULL)
{
printf("0\n");
return;
}
apar(t->fii[s[0]-'a'], s+1);
}
inline int prefix(Trie *t,char *s,int nr)
{
if(strlen(s)==0) return nr;
if(t->fii[s[0]-'a']==NULL) return nr;
return prefix(t->fii[s[0]-'a'], s+1,nr+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
scanf("%d ",&op);
memset(s,'\0',sizeof(s));
gets(s);
while(!feof(stdin))
{
if(op==0)
{
baa=1;
upd(t,s);
}
else if(op==1)
{
baa=-1;
upd(t,s);
}
else if(op==2) apar(t,s);
else
printf("%d\n",prefix(t,s,0));
memset(s,'\0',sizeof(s));
scanf("%d ",&op);
gets(s);
}
return 0;
}