Pagini recente » Cod sursa (job #806442) | Cod sursa (job #997573) | Cod sursa (job #2398613) | Cod sursa (job #2058035) | Cod sursa (job #1096929)
#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;
}
void Delete(char w[])
{
int l=strlen(w);
Node *t=&Trie;
stack<Node*> stk;
for(int i=0;i<l;++i)
{
int ind=w[i]-'a';
t=t->sons[ind];
stk.push(t);
}
t->n-=1;
if(t->n==0&&t->nrs==0)
{
while(!stk.empty()&&t->n==0&&t->nrs<=1)
{
l-=1;
delete(t);
stk.pop();
t=stk.top();
t->sons[w[l]-'a']=0;
}
t->nrs-=1;
}
}
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&&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(w);
break;
case 2:
printf("%d\n",NumberOfOcurences(w));
break;
case 3:
printf("%d\n",LongestPrefix(w));
break;
}
}
return 0;
}