Pagini recente » Cod sursa (job #2546406) | Cod sursa (job #3258601) | Cod sursa (job #1455907) | Cod sursa (job #2726597) | Cod sursa (job #2248026)
#include<fstream>
#include<cstring>
#include<string>
#define D (*S-'a')
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie {
int Cont,Fii;
Trie *Fiu[30];
Trie(){
Cont=0;
Fii=0;
memset(Fiu,0,sizeof(Fiu));
}
};
Trie *T=new Trie;
void Add(Trie *Nod, char *S){
if(*S=='\0'){
Nod->Cont++;
return;
}
if(Nod->Fiu[D] == 0){
Nod->Fiu[D]= new Trie;
Nod->Fii++;
}
Add(Nod->Fiu[D],S+1);
}
int Del(Trie *Nod,char *S){
if(*S=='\0'){
Nod->Cont--;
}
else if(Del(Nod->Fiu[D],S+1)){
Nod->Fiu[D]=0;
Nod->Fii--;
}
if(Nod->Cont==0 && Nod->Fii==0 && Nod!=T){
delete Nod;
return 1;
}
return 0;
}
int Query(Trie *Nod,char *S){
if(*S=='\0')
return Nod->Cont;
if(Nod->Fiu[D])
return Query(Nod->Fiu[D],S+1);
return 0;
}
int Prefix(Trie *Nod,char *S,int K){
if(*S=='\0' || Nod->Fiu[D] == 0)
return K;
return Prefix(Nod->Fiu[D],S+1,K+1);
}
int main(){
int Com;
char Cuv[30];
while(fin>>Com>>Cuv){
if(Com==0)
Add(T,Cuv);
if(Com==1)
Del(T,Cuv);
if(Com==2)
fout<<Query(T,Cuv)<<'\n';
if(Com==3)
fout<<Prefix(T,Cuv,0)<<'\n';
}
return 0;
}