Pagini recente » Cod sursa (job #1601574) | Cod sursa (job #1253745) | Cod sursa (job #2365880) | Cod sursa (job #1090596) | Cod sursa (job #2079627)
# include <fstream>
# include <cstring>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod{
int nr,vecini;
nod *next[26];
} *tata;
char cuv[25];
int n,op;
void initializare(nod *&a){
a=new nod;
for(int i=0;i<26;i++)
a->next[i]=NULL;
a->nr=a->vecini=0;
}
void adauga(nod *&nc,int poz){
if(nc==NULL)
initializare(nc);
if(poz==n+1){
nc->nr++;
return;
}
if(nc->next[cuv[poz]-'a']==NULL)
nc->vecini++;
adauga(nc->next[cuv[poz]-'a'],poz+1);
}
void sterge(nod *&nc,int poz){
if(poz==n+1)
nc->nr--;
else{
if(nc->next[cuv[poz]-'a']!=NULL){
sterge(nc->next[cuv[poz]-'a'],poz+1);
if(nc->next[cuv[poz]-'a']==NULL)
nc->vecini--;
}
}
if(nc->nr==0&&nc->vecini==0){
delete nc;
nc=NULL;
}
}
int aparitii(nod *&nc,int poz){
if(poz==n+1)
return nc->nr;
if(nc->next[cuv[poz]-'a']==NULL)
return 0;
else
return aparitii(nc->next[cuv[poz]-'a'],poz+1);
}
int prefix(nod *&nc,int poz){
if(poz==n+1)
return 0;
if(nc->next[cuv[poz]-'a']==NULL)
return 0;
else
return 1+prefix(nc->next[cuv[poz]-'a'],poz+1);
}
int main () {
initializare(tata);
while(fin>>op>>cuv+1){
n=strlen(cuv+1);
if(op==0){
adauga(tata,1);
continue;
}
if(op==1){
sterge(tata,1);
continue;
}
if(op==2){
fout<<aparitii(tata,1)<<"\n";
continue;
}
fout<<prefix(tata,1)<<"\n";
}
return 0;
}