Cod sursa(job #585405)
#include <fstream>
#include <cstring>
#define cat(s) ((*s)-'a')
using namespace std;
class trie
{public:
int cont,nrfii;
trie *fiu[26];
trie()
{cont=nrfii=0;
memset(fiu,0,sizeof(fiu));}
void insert(trie *,char*);
int del(trie*,char*);
int query(trie*,char*);
int prefix_comun(trie*,char*,int);};
trie *t=new trie();
void trie::insert(trie *sursa,char *s)
{if(*s=='\0')
{++sursa->cont;
return;}
if(!sursa->fiu[cat(s)])
{sursa->fiu[cat(s)]=new trie();
++sursa->nrfii;}
sursa->insert(sursa->fiu[cat(s)],s+1);}
int trie::del(trie *sursa,char *s)
{if(*s=='\0')
--sursa->cont;
else
if(sursa->del(sursa->fiu[cat(s)],s+1))
{sursa->fiu[cat(s)]=0;
--sursa->nrfii;}
if(!(sursa->cont)&&!(sursa->nrfii)&&sursa!=t)
{delete sursa;
return 1;}
return 0;}
int trie::query(trie *sursa, char *s)
{if(*s=='\0')
return sursa->cont;
if(sursa->fiu[cat(s)])
return query(sursa->fiu[cat(s)],s+1);
return 0;}
int trie::prefix_comun(trie *sursa, char *s,int lg)
{if(*s=='\0'||sursa->fiu[cat(s)]==0)
return lg;
return prefix_comun(sursa->fiu[cat(s)],s+1,lg+1);}
int main()
{int ce;
char cuv[32];
ifstream f("trie.in");
ofstream g("trie.out");
for(;!f.eof();f.get())
{f>>ce;
f>>cuv;
if(f.good())
if(!ce)
t->insert(t,cuv);
else
if(ce==1)
t->del(t,cuv);
else
if(ce==2)
g<<t->query(t,cuv)<<'\n';
else
if(ce==3)
g<<t->prefix_comun(t,cuv,0)<<'\n';}
f.close();
g.close();
return 0;}