Pagini recente » Cod sursa (job #2821747) | Cod sursa (job #824566) | Cod sursa (job #1284933) | Cod sursa (job #1628092) | Cod sursa (job #1645447)
#include <cstdio>
#include <cstring>
using namespace std;
char v[22];
struct trie
{
int nrcuv,nrfii;
trie *fiu[26];
trie()
{
nrcuv=nrfii=0;
memset(fiu,0,sizeof(fiu));
}
};
trie *root=new trie;
void add(trie *nod)
{
for(int i=0;v[i];i++)
{
int ch=v[i]-'a';
if(nod->fiu[ch]==0)
{
nod->fiu[ch]=new trie;
nod->nrfii++;
}
nod=nod->fiu[ch];
}
nod->nrcuv++;
}
bool del(trie *nod,int i)
{
if(v[i]==0) nod->nrcuv--;
else if(del(nod->fiu[v[i]-'a'],i+1))
{
nod->fiu[v[i]-'a']=0;
nod->nrfii--;
}
if(nod->nrcuv==0&&nod->nrfii==0&&nod!=root) {delete nod;return 1;}
return 0;
}
int cnt(trie *nod)
{
for(int i=0;v[i] ;i++)
{
int ch=v[i]-'a';
if(nod->fiu[ch]==0) return 0;
nod=nod->fiu[ch];
}
return nod->nrcuv;
}
int prefix(trie *nod)
{
int i;
for(i=0;v[i];i++)
{
int ch=v[i]-'a';
if(v[i]==0 || nod->fiu[ch]==0) return i;
nod=nod->fiu[ch];
}
return i;
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int ok;
while(1)
{
scanf("%d %s\n",&ok,v);
if(v[0]==0) break;
if(ok==0) add(root);
if(ok==1) del(root,0);
if(ok==2) printf("%d\n",cnt(root));
if(ok==3) printf("%d\n",prefix(root));
memset(v,0,sizeof(v));
}
}