Pagini recente » Cod sursa (job #134640) | Cod sursa (job #188743) | Cod sursa (job #2006795) | Cod sursa (job #389953) | Cod sursa (job #2247180)
#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[26];
Trie(){
Cont=0;
Fii=0;
memset(Fiu,0,sizeof(Fiu));
}
};
Trie *T=new Trie;
void Add(Trie *Nod, char *S){
if(*S=='\n'){
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=='\n'){
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=='\n')
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=='\n' || 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);
if(Com==3)
fout<<Prefix(T,Cuv,0);
}
return 0;
}