Pagini recente » Cod sursa (job #1154071) | Cod sursa (job #1488451) | Cod sursa (job #1882804) | Cod sursa (job #1731094) | Cod sursa (job #1097349)
#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;
inline int INT(char *c) { return *c-'a'; }
void Insert(Node *t,char *w)
{
if(!*w)
t->n+=1;
else
{
if(!t->sons[INT(w)])
t->sons[INT(w)]=new Node;
t->nrs+=1;
Insert(t->sons[INT(w)],w+1);
}
}
void Delete(Node *t, char *w)
{
if(!*w)
t->n-=1;
else
{
Node *son=t->sons[INT(w)];
Delete(son,w+1);
if(son->n==0&&son->nrs==0)
{
t->sons[INT(w)]=0;
t->nrs-=1;
delete(son);
}
}
}
int NumberOfOcurences(Node *t, char *w)
{
if(!t)
return 0;
if(!*w)
return t->n;
return NumberOfOcurences(t->sons[INT(w)],w+1);
}
int LongestPrefix(Node *t, char *w)
{
if(!*w&&t)
return 0;
if(!t)
return -1;
return 1+LongestPrefix(t->sons[INT(w)],w+1);
}
int main()
{
int n;
Trie=new Node;
while(scanf("%d",&n)!=EOF)
{
char w[25];
scanf(" %s",w);
switch(n)
{
case 0:
Insert(Trie,w);
break;
case 1:
Delete(Trie,w);
break;
case 2:
printf("%d\n",NumberOfOcurences(Trie,w));
break;
case 3:
printf("%d\n",LongestPrefix(Trie,w));
break;
}
}
return 0;
}