Pagini recente » Cod sursa (job #1914353) | Cod sursa (job #1086223) | Cod sursa (job #2035108) | Cod sursa (job #1612868) | Cod sursa (job #664677)
Cod sursa(job #664677)
#include<cstdio>
using namespace std;
struct node{
int inf,nosoons;
node *soons[26];
node()
{
inf=0;nosoons=0;
for(int i=0;i<=26;i++)
soons[i]=0;
}
}*root=new node();
int type,del(node *curr,char *c),number(node *curr,char *c),prefix(node *curr,char *c,int);
char word[30];
void read(),solve(),insert(node *curr,char *c);
int main()
{
solve();
return 0;
}
void solve()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
//root=new node;
while(1)
{
if(scanf("%d",&type)==-1)break;
scanf("%s",word);
if(type==0)insert(root,word);
else if(type==1)del(root,word);
else if(type==2)printf("%d\n",number(root,word));
else if(type==3)printf("%d\n",prefix(root,word,0));
}
}
void insert(node *curr,char *c)
{
if(!*c)
{
curr->inf++;
return;
}
int k=*c-'a';
if(!curr->soons[k])
{
curr->soons[k]=new node;
curr->nosoons++;
}
insert(curr->soons[k],c+1);
}
int del(node *curr,char *c)
{
int k=*c-'a';
if(!*c)
{
curr->inf--;
}
else if(del(curr->soons[k],c+1))
{
curr->nosoons--;
curr->soons[k]=0;
}
if(curr->inf==0 && curr->nosoons==0 && curr!=root)
{
delete curr;return 1;
}
return 0;
}
int number(node *curr,char *c)
{
if(!*c)
return curr->inf;
int k=*c-'a';
if(curr->soons[k])return number(curr->soons[k],c+1);
return 0;
}
int prefix(node *curr,char *c,int sol)
{
int k=*c-'a';
if(!(*c) || curr->soons[k]==0)return sol;
return(prefix(curr->soons[k],(c+1),(sol+1)));
}