Cod sursa(job #825846)
#include<fstream>
#include<string.h>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie{
int nr;
int nf;
trie *f[26];
trie(){
nr=0;
nf=0;
for(int i=0;i<26;i++)
f[i]=0;
}
}*r,*p,*c;
int op,val,ok,lungime;
unsigned int i;
char cuv[24];
void stergere(unsigned int i,trie *p){
if(i==strlen(cuv)){
p->nr--;
return;
}
int val1=cuv[i]-'a';
stergere(i+1,p->f[val1]);
if(p->f[val1]->nr==0&&p->f[val1]->nf==0){
p->nf--;
p->f[val1]=0;
delete p->f[val1];
}
}
int main(){
r=new trie;
while(f>>op){
f>>cuv;
if(op==0){
p=r;
for(i=0;i<strlen(cuv);i++){
val=cuv[i]-'a';
if(p->f[val]!=0)
p=p->f[val];
else{
c=new trie;
p->f[val]=c;
p->nf++;
p=c;
}
}
p->nr++;
}
else{
if(op==1){
/*p=r;
for(i=0;i<strlen(cuv);i++){
val=cuv[i]-'a';
c=p;
p=p->f[val];
}
p->nr--;
if(p->nr==0&&p->nf==0){
c->f[val]=0;
delete c->f[val];
}*/
stergere(0,r);
}
else{
if(op==2){
p=r;ok=1;
for(i=0;i<strlen(cuv);i++){
val=cuv[i]-'a';
if(p->f[val]!=0)
p=p->f[val];
else{
ok=0;
break;
}
}
if(ok)
g<<p->nr<<"\n";
else
g<<"0\n";
}
else{
p=r;
for(i=0;i<strlen(cuv);i++){
val=cuv[i]-'a';
if(p->nf>0||p->nr>0)
lungime=i;
if(p->f[val]!=0)
p=p->f[val];
else
break;
}
g<<lungime<<"\n";
}
}
}
}
return 0;
}