Pagini recente » Cod sursa (job #1057711) | Cod sursa (job #1861478) | Cod sursa (job #2460361) | Cod sursa (job #1883461) | Cod sursa (job #815121)
Cod sursa(job #815121)
#include<cstdio>
using namespace std;
struct trie
{
trie *N[26];
int S,C;
trie()
{
C=S=0;
for(int i=0;i<26;i++) N[i]=0;
}
};
trie *R,*Q,*ST[30],*X;
char line[33],*p;
int i,q;
void insertWord(char *cuv)
{
for(p=cuv,q=0,Q=R;*p;p++,q++)
{
if(!('a'<=*p&&*p<='z')) break;
i=*p-'a';
ST[q]=Q;
if(!Q->N[i]) Q->N[i]=new trie;
Q=Q->N[i];
}
ST[q]=Q;
for(i=0;i<q;i++) ST[i]->S++;
ST[q]->C++;
}
void deleteWord(char *cuv)
{
for(p=cuv,q=0,Q=R;*p;p++,q++)
{
if(!('a'<=*p&&*p<='z')) break;
i=*p-'a';
ST[q]=Q;
if(!Q->N[i]) Q->N[i]=new trie;
Q=Q->N[i];
}
ST[q]=Q;
for(i=0;i<q;i++) ST[i]->S--;
ST[q]->C--;
for(i=q-1;i>=0;i--)
{
if(ST[i+1]->C+ST[i+1]->S) break;
X=ST[i+1];
ST[i+1]=0;
ST[i]->N[cuv[i]-'a']=0;
delete X;
}
}
void writeAppearances(char *cuv)
{
for(p=cuv,Q=R;*p;p++)
{
if(!('a'<=*p&&*p<='z')) break;
i=*p-'a';
Q=Q->N[i];
if(!Q) break;
}
if(!(Q==0||Q==R)) printf("%d\n",Q->C);
else printf("0\n");
}
void writePrefix(char *cuv)
{
int lenght=0;
for(p=cuv,Q=R;*p;p++)
{
if(!('a'<=*p&&*p<='z')) break;
i=*p-'a';
Q=Q->N[i];
if(!Q) break;
lenght++;
}
printf("%d\n",lenght);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
R=new trie;
fgets(line,32,stdin);
while(!feof(stdin))
{
switch(line[0]-'0')
{
case 0: {insertWord(line+2); break;}
case 1: {deleteWord(line+2); break;}
case 2: {writeAppearances(line+2); break;}
case 3: {writePrefix(line+2); break;}
}
fgets(line,32,stdin);
}
return 0;
}