Pagini recente » Cod sursa (job #1537829) | Cod sursa (job #953395) | Cod sursa (job #2235793) | Cod sursa (job #1901670) | Cod sursa (job #1097084)
#include <fstream>
#include <cstring>
#include <stack>
using namespace std;
FILE* f=freopen("trie.in","r",stdin);
FILE* o=freopen("trie.out","w",stdout);
struct Node
{
int n,nrs;
Node* sons[27];
Node()
{
n=nrs=0;
memset(sons,0,sizeof(sons));
}
} Trie;
void Insert(char w[])
{
int l=strlen(w);
Node *t=&Trie;
for(int i=0;i<l;++i)
{
int ind=w[i]-'a';
if(t->sons[ind]==0)
t->sons[ind]=new Node,t->nrs+=1;
t=t->sons[ind];
}
t->n+=1;
}
int Delete(Node *t, char w[],int i)
{
if(!w[i])
t->n-=1;
else if(Delete(t->sons[w[i]-'a'],w,i+1))
t->sons[w[i]='a']=0,t->nrs-=1;
if(t->n==0&&t->nrs==0&&t!=&Trie)
{
delete(t);
return 1;
}
return 0;
}
int NumberOfOcurences(char w[])
{
int l=strlen(w);
Node *t=&Trie;
for(int i=0;i<l&&t;++i)
{
int ind=w[i]-'a';
t=t->sons[ind];
}
if(!t) return 0;
return t->n;
}
int LongestPrefix(char w[])
{
int l=strlen(w);
Node *t=&Trie;
int i;
for(i=0;i<l-1&&t;++i)
{
int ind=w[i]-'a';
t=t->sons[ind];
}
return i-1;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
char w[25];
scanf(" %s",w);
switch(n)
{
case 0:
Insert(w);
break;
case 1:
Delete(&Trie,w,0);
break;
case 2:
printf("%d\n",NumberOfOcurences(w));
break;
case 3:
printf("%d\n",LongestPrefix(w));
break;
}
}
return 0;
}