Pagini recente » Cod sursa (job #173294) | Cod sursa (job #2900531) | Cod sursa (job #1024514) | Cod sursa (job #2053144) | Cod sursa (job #2010398)
#include<cstdio>
#include<cstring>
using namespace std;
struct Trie
{
Trie *fii[30];
int nrfii;
int nrcuv;
Trie()
{
nrfii=nrcuv=0;
memset(fii,0,sizeof(fii));
}
};
Trie *mainroot = new Trie;
inline int gn(char ch)
{
return ch-'a';
}
inline void add(Trie *root , char *s)
{
int n=strlen(s),i;
for(i=0;i<n;root=root->fii[gn(s[i++])])
if(root->fii[gn(s[i])] == 0)
{
root->fii[gn(s[i])] = new Trie;
root->nrfii++;
}
root->nrcuv++;
}
inline int frecv(Trie *root , char *s)
{
int n=strlen(s),i;
for(i=0;i<strlen(s);root = root->fii[gn(s[i++])])
if(root->fii[gn(s[i])] == 0)
return 0;
return root->nrcuv;
}
inline int compref(Trie *root , char *s)
{
int n=strlen(s),i;
for(i=0;i<n;root=root->fii[gn(s[i++])])
if(root->fii[gn(s[i])]==0)
return i;
return n;
}
inline bool del(Trie *root,char *s)
{
if(*s == 0 )
{
root->nrcuv--;
if(root->nrcuv == 0 && root->nrfii == 0)
return 1;
return 0;
}
if(root->fii[*s-'a'] == 0)
return false;
if(del(root->fii[*s-'a'],s+1))
{
delete root->fii[*s-'a'];
root->fii[*s-'a'] = NULL;
root->nrfii--;
}
if(root->nrcuv==0 && root->nrfii == 0)
return 1;
return 0;
}
char s[30];
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int op;
while(scanf("%d ",&op) != EOF)
{
gets(s);
if(op==0)
add(mainroot,s);
else if(op==1)
del(mainroot,s);
else if(op==2)
printf("%d\n",frecv(mainroot,s));
else
printf("%d\n",compref(mainroot,s));
}
}