Pagini recente » Cod sursa (job #1483372) | Cod sursa (job #2508081) | Cod sursa (job #3180068) | Cod sursa (job #165417) | Cod sursa (job #2165419)
#include <bits/stdc++.h>
#define INFILE "trie.in"
#define OUTFILE "trie.out"
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
struct Nod{
int words;
int nrfii;
Nod *fii[26];
Nod(){
words=0;
nrfii=0;
memset(fii,0,sizeof(fii));
}
};
class Trie{
public:
Trie(){
rad=new Nod;
}
void Inserare(char *s){
ins(rad,s);
}
void Delete(char *s){
del(rad,s);
}
int Prefix(char* s){
return pre(rad,s,0);
}
int Words(char* s){
return query(rad,s);
}
void ins(Nod*x,char*s){
if(*s==NULL){
x->words++;
return;
}
if(x->fii[Tr(s)]==nullptr){
x->nrfii++;
x->fii[Tr(s)]=new Nod;
}
ins(x->fii[Tr(s)],s+1);
}
bool del(Nod*x,char*s){
if(*s==NULL){
x->words--;
}
else if(del(x->fii[Tr(s)],s+1)){
x->fii[Tr(s)]=nullptr;
x->nrfii--;
}
if(x->nrfii==0&&x!=rad&&x->words==0){
delete x;
return true;
}
return false;
}
int query(Nod*x,char*s){
if(*s==NULL){
return x->words;
}
if(x->fii[Tr(s)]!=nullptr){
return query(x->fii[Tr(s)],s+1);
}
return 0;
}
int pre(Nod*x,char*s,int k){
if(*s==NULL||x->fii[Tr(s)]==nullptr){
return k;
}
return pre(x->fii[Tr(s)],s+1,k+1);
}
private:
Nod*rad;
int Tr(char*s){
return *s-'a';
}
};
char*ConvertStringToChar(string s){
char* chr;
chr=new char[s.size()+1];
for(int i=0;i<s.size();i++){
chr[i]=s[i];
}
chr[s.size()]=NULL;
return chr;
}
int main(){
Trie tr;
int tip;
while(in>>tip){
string str;
in>>str;
char*s=ConvertStringToChar(str);
if(tip==0){
tr.Inserare(s);
}
else if(tip==1){
tr.Delete(s);
}
else if(tip==2){
out<<tr.Words(s)<<"\n";
}
else if(tip==3){
out<<tr.Prefix(s)<<"\n";
}
}
return 0;
}