Pagini recente » Cod sursa (job #250390) | Cod sursa (job #71062) | Cod sursa (job #310476) | Cod sursa (job #659004) | Cod sursa (job #585353)
Cod sursa(job #585353)
#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();
long y[26]={0};
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;
long i=0;
int main()
{
int ce;
char *cuv;
ifstream f("trie.in");
ofstream g("trie.out");
for( ;!f.eof();f.get()) {
f>>ce;
f>>cuv;
i++;
if(f.good()) {
if(!ce) {t->insert(t,cuv);
y[*cuv-'a']++;}
else if(ce==1) {t->del(t,cuv);
if(y[*cuv-'a']>0)
y[*cuv-'a']--;}
else if(ce==2) {if(i==70773||i==70777)
printf("%ld %ld %d\n",i,y[*cuv-'a'],t->query(t,cuv));
g<<t->query(t,cuv)<<'\n';}
else if(ce==3)
g<<t->prefix_comun(t,cuv,0)<<'\n';
}
}
f.close();
g.close();
return 0;
}