Pagini recente » Cod sursa (job #762083) | Cod sursa (job #2589113) | Cod sursa (job #2658148) | Cod sursa (job #1869182) | Cod sursa (job #2509702)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char c[25];
int cod;
struct nod{
int fii;
int cnt;
nod *f[26];
nod(){
cnt=0;
fii=0;
for(int i=0; i<26; i++)
f[i]=0;
}
};
nod *rad;
void inserare(nod *p, char *c){
char ch=*c;
if(ch){
if (p->f[ch-'a']==NULL) {
p->f[ch-'a']=new nod;
p->fii++;
}
inserare(p->f[ch-'a'], c+1);
} else
p->cnt++;
}
int stergere(nod *&p, char *c){
char ch=*c;
if(ch==0){
p->cnt--;
if(p->cnt==0 && p->fii==0 && p!=rad){
delete p;
p=0;
return 1;
}
return 0;
}
if(stergere(p->f[ch-'a'],c+1)){
p->fii--;
if(p->cnt==0 && p->fii==0 && p!=rad){
delete p;
p=0;
return 1;
}
}
return 0;
}
int aparitii(nod *p, char *c){
char ch=*c;
if (ch==0)
return p->cnt;
if (p->f[ch-'a']==NULL)
return 0;
return aparitii(p->f[ch-'a'],c+1);
}
int prefix(nod *p, char *c){
char ch=*c;
if (ch==0)
return 0;
if (p->f[ch-'a']==NULL)
return 0;
return 1+prefix(p->f[ch-'a'], c+1);
}
int main(){
rad=new nod;
while(fin>>cod){
fin>>c;
if(cod==0)
inserare(rad,c);
else if(cod==1)
stergere(rad,c);
else if(cod==2)
fout<<aparitii(rad,c)<<"\n";
else
fout<<prefix(rad,c)<<"\n";
}
return 0;
}