Pagini recente » Cod sursa (job #1907830) | Cod sursa (job #852887) | Cod sursa (job #156511) | Cod sursa (job #3178844) | Cod sursa (job #795053)
Cod sursa(job #795053)
#include<fstream>
#include<iostream>
#include<cstring>
#include<string>
#include<cassert>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
string::iterator it;
struct Trie{
int words,nrfii;
Trie *son[26];
Trie(){
words=nrfii=0;
memset(son,0,sizeof(son));
}
};
Trie *T = new Trie;
void add(Trie *nod,string::iterator it){
if(*it=='\0'){
nod->words++;
return;
}
//assert(0<=*it-'a' && *it-'a'<=25);
if(nod->son[*it-'a']==0){
nod->son[*it-'a'] = new Trie;
nod->nrfii++;
}
//assert(nod->son[*it-'a']!=0);
add(nod->son[*it-'a'],it+1);
}
bool del(Trie *nod,string::iterator it){
if(*it == '\0'){
if(nod->nrfii || nod->words>1)
return 0;
delete nod;
return 1;
}
//assert(0<=*it-'a' && *it-'a'<=25);
//assert(nod->son[*it-'a']!=0);
if( del(nod->son[*it-'a'],it+1) ){
nod->nrfii--;
//assert(0<=*it-'a' && *it-'a'<=25);
nod->son[*it-'a']=0;
if(nod->nrfii || nod->words)
return 0;
delete nod;
return 1;
}
return 0;
}
int nrap(Trie *nod,string::iterator it){
if(*it=='\0')
return nod->words;
//assert(0<=*it-'a' && *it-'a'<=25);
//assert(nod->son[*it-'a']!=0);
return nrap(nod->son[*it-'a'],it+1);
}
int lgpr(Trie *nod,string::iterator it){
//assert(0<=*it-'a' && *it-'a'<=25);
if(*it!='\0' && nod->son[*it-'a']){
//assert(nod->son[*it-'a']!=0 || *it=='\0');
return 1+lgpr(nod->son[*it-'a'],it+1);
}
return 0;
}
int main(){
int cod;
string w;
while(!fin.eof()){
fin>>cod>>w;
it=w.begin();
if(cod==0){
add(T,it);
}
if(cod==1){
del(T,it);
}
if(cod==2){
fout<<nrap(T,it)<<'\n';
}
if(cod==3){
fout<<lgpr(T,it)<<'\n';
}
cod=4;
}
fin.close();
fout.close();
return 0;
}