Cod sursa(job #486230)
/*
* File: main.cpp
* Author: petru
*
* Created on 2010-09-20
*/
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <deque>
#include <set>
#include <bitset>
#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[32];
ifstream f("trie.in");
ofstream g("trie.out");
for( ;!f.eof();f.get()) {
f>>ce;
f>>cuv;
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;
}