Cod sursa(job #717494)
#include <cstring>
#include <fstream>
using namespace std;
struct nod{
nod *v[26];
int fii;
int nr;
nod(){
fii=nr=0;
memset(v,0,sizeof(v) );
}
};
nod *T=new nod;
void adaug(nod *t,char *s){
if(!*s){
t->nr++;
return;
}
if(t->v[*s-'a']==0){
t->v[*s-'a']=new nod;
t->fii++;
}
adaug(t->v[*s-'a'],s+1);
}
int del(nod *t,char*s){
if (!*s)
t->nr--;
else
if (del(t->v[*s-'a'],s+1)){
t->v[*s-'a']=0;
t->fii--;
}
if (!t->nr && !t->fii && t!=T){
delete t; return 1;
}
return 0;
}
int query(nod *t, char *s){
if (!*s)
return t->nr;
if (t->v[*s-'a'])
return query(t->v[*s-'a'],s+1);
return 0;
}
int prefix(nod *t,char *s,int i){
if (!*s || !t->v[*s-'a'])
return i;
return prefix(t->v[*s-'a'],s+1,i+1);
}
int main ()
{
ifstream fin("trie.in");
ofstream fout("trie.out");
char c[23];
fin.getline(c,23);
while(!fin.eof()){
if (c[0]=='0') adaug(T,c+2);
else if (c[0]=='1') del(T,c+2);
else if (c[0]=='2') fout<<query(T,c+2)<<endl;
else if (c[0]=='3') fout<<prefix(T,c+2,0)<<endl;
fin.getline(c,23);
}
return 0;
}