Pagini recente » Cod sursa (job #2352264) | Cod sursa (job #849158) | Cod sursa (job #1125995) | Cod sursa (job #1211445) | Cod sursa (job #824406)
Cod sursa(job #824406)
#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;
}
if(nod->son[*it-'a']==0){
nod->son[*it-'a'] = new Trie;
nod->nrfii++;
}
add(nod->son[*it-'a'],it+1);
}
bool del(Trie *nod,string::iterator it){
if(*it == '\0'){
if(nod->nrfii || nod->words>1){
nod->words--;
return 0;
}
delete nod;
return 1;
}
if( del(nod->son[*it-'a'],it+1) ){
nod->nrfii--;
nod->son[*it-'a']=0;
if(nod->nrfii || nod->words || nod==T)
return 0;
delete nod;
return 1;
}
return 0;
}
int nrap(Trie *nod,string::iterator it){
if(*it=='\0')
return nod->words;
if(nod->son[*it-'a'])
return nrap(nod->son[*it-'a'],it+1);
return 0;
}
int lgpr(Trie *nod,string::iterator it){
if(*it!='\0' && nod->son[*it-'a']!=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;
}