Pagini recente » Cod sursa (job #1646465) | Cod sursa (job #3122375) | Cod sursa (job #2132837) | Cod sursa (job #3226962) | Cod sursa (job #2082747)
#include <fstream>
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
struct trie{
int fii;
int ap;
trie *f[26];
trie(){
ap=fii=0;
for(int i=0;i<26;i++){
f[i]=0;
}
}
};
trie *rad=new trie;
char s[23];
void adaugare(trie *&r, char *s){
if(*s != NULL){
if(r->f[*s-'a'] == NULL){
r->fii++;
r->f[*s-'a'] = new trie;
}
adaugare(r->f[*s-'a'],s+1);
}
else
r->ap++;
}
int sterge(trie *&r, char *s){
if (*s == NULL){
r->ap--;
if(r->fii == 0 && r->ap == 0){
delete r;
return 1;
}
}
int ok = sterge(r->f[*s-'a'],s+1);
if(ok){
r->fii--;
r->f[*s-'a'] = NULL;
if(r->ap==0 && r->fii==0 && r!=rad){
delete r;
return 1;
}
}
return 0;
}
int nrap(trie *r, char *s){
if(r->f[*s-'a']==NULL)
return r->ap;
if(*s!=NULL)
return nrap(r->f[*s-'a'],s+1);
else
return r->ap;
}
void prefix(trie *r, char *s, int nivel){
if(r->f[*s-'a']==NULL || *s==NULL)
fout<<nivel<<"\n";
else
prefix(r->f[*s-'a'],s+1,nivel+1);
}
void deleteTrie(trie *&r){
if(r!=NULL)
for(int i=0;i<26;i++)
deleteTrie(r->f[i]);
else
delete r;
}
int t;
int main(){
while(fin>>t>>s){
if(t==0){
adaugare(rad,s);
}
if(t==1)
sterge(rad,s);
if(t==2)
fout<<nrap(rad,s)<<"\n";
if(t==3)
prefix(rad,s,0);
}
deleteTrie(rad);
//delete rad;
return 0;
}