Pagini recente » Cod sursa (job #2925968) | Cod sursa (job #2298021) | Cod sursa (job #3201600) | Cod sursa (job #3172667) | Cod sursa (job #852093)
Cod sursa(job #852093)
#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 *sursa, char *s);
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)])
{//n-a mai aparut litera 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 n;
int main()
{ int ce;
char cuv[21];
ifstream f("trie.in"); ofstream g("trie.out");
for( ;!f.eof();f.get())
{ f>>ce>>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';
}
}
g.close(); return 0;
}