Pagini recente » Cod sursa (job #397886) | Cod sursa (job #1147003) | Cod sursa (job #2743920) | Cod sursa (job #539634) | Cod sursa (job #2259925)
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
struct trie{
int ap;
trie *letter[28];
trie(){
ap=0;
for(int i=0;i<=26;i++)
letter[i]=NULL;
}
} *root;
void adauga(string w){
trie *current=root;
current->ap++;
for(int i=0;i<w.size();i++){
if(current->letter[w[i]-'a']==NULL)
current->letter[w[i]-'a']=new trie();
current=current->letter[w[i]-'a'];
current->ap++;
}
}
void sterge(string w){
trie *current=root;
current->ap--;
for(int i=0;i<w.size();i++){
current=current->letter[w[i]-'a'];
current->ap--;
}
}
int noAp(string w){
int i, others=0;
trie *current=root;
for(i=0;i<w.size();i++)
if(current->letter[w[i]-'a']==NULL)
return 0;
else
current=current->letter[w[i]-'a'];
for(i=0;i<26;i++)
if(current->letter[i]!=NULL) others+=current->letter[i]->ap;
return current->ap - others;
}
int lungComPrefix(string w){
trie *current=root;
int sol=0;
for(int i=0;i<w.size();i++)
if(current->letter[w[i]-'a']==NULL || current->letter[w[i]-'a']->ap==0) return sol;
else {
sol++;
current=current->letter[w[i]-'a'];
}
return sol;
}
int main(){
ifstream in("trie.in");
FILE *out=fopen("trie.out","w");
string word;
int c;
root=new trie();
while(in>>c>>word){
switch(c){
case(0):{
adauga(word);
break;
}
case(1):{
sterge(word);
break;
}
case(2):{
fprintf(out,"%i\n",noAp(word));
break;
}
case(3):{
fprintf(out,"%i\n",lungComPrefix(word));
break;
}
}
}
in.close(); fclose(out);
return 0;
}