Pagini recente » Cod sursa (job #3278400) | Cod sursa (job #3210793) | Borderou de evaluare (job #1133981) | Cod sursa (job #3230011) | Cod sursa (job #2507901)
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod{
int nr;
int fii;
nod *f[26];
nod(){
nr=0;
fii=0;
for(int i=0;i<26;i++)
f[i]=NULL;
}
};
nod *r;
void Insert(nod *t, char *p){
if(*p==0){
t->nr++;
return;
}
if(t->f[*p-'a'] == NULL){
t->f[*p-'a']=new nod;
t->fii++;
}
Insert(t->f[*p-'a'],p+1);
}
int Cnt(nod *t, char *p){
if(*p==0)
return t->nr;
if(t->f[*p-'a']==NULL)
return 0;
return Cnt(t->f[*p-'a'],p+1);
}
int Prefix(nod *t, char *p){
if(*p==0)
return 0;
if(t->f[*p-'a']==NULL)
return 0;
return 1+Prefix(t->f[*p-'a'],p+1);
}
int Delete(nod *&t, char *p){
///returneaza 1 daca sterge nodul si 0 in caz contrar
if(*p==0){
t->nr--;
if(t->nr==0 && t->fii==0 && t!=r){
delete t;
t=0;
return 1;
}
return 0;
}
if(Delete(t->f[*p-'a'],p+1)){
t->fii--;
if(t->nr==0 && t->fii==0 && t!=r){
delete t;
t=0;
return 1;
}
}
return 0;
}
int t;
char s[20];
int main(){
r=new nod;
while(fin>>t){
fin>>s;
switch(t){
case 0: Insert(r,s); break;
case 1: Delete(r,s); break;
case 2: fout<<Cnt(r,s)<<"\n"; break;
case 3: fout<<Prefix(r,s)<<"\n"; break;
}
}
return 0;
}