Pagini recente » Cod sursa (job #3285536) | Cod sursa (job #3293463)
#include <fstream>
#define nmax (int)(1e5+1)
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
int task,sol;
string s;
struct nod{
int prefix,cuv;
nod* fr[26];
nod(){
prefix=cuv=0;
for(int i=0;i<26;i++)
fr[i]=0;
}
};
nod* n=new nod;
void add(nod* n,int i){
(*n).prefix++;
if(s[i]==0){
(*n).cuv++;
return ;
}
if((*n).fr[s[i]-'a']==0)
(*n).fr[s[i]-'a']=new nod;
add((*n).fr[s[i]-'a'],i+1);
}
void cut(nod* n,int i){
(*n).prefix--;
if(s[i]==0){
(*n).cuv--;
return ;
}
cut((*n).fr[s[i]-'a'],i+1);
}
int get_number(nod* n,int i){
if(s[i]==0)
return (*n).cuv;
if((*n).fr[s[i]-'a']==0)
return 0;
return get_number((*n).fr[s[i]-'a'],i+1);
}
int pref_max(nod* n,int i){
if((*n).prefix<=0)
return max(0,i-1);
if(s[i]==0)
return i;
if((*n).fr[s[i]-'a']==0)
return i;
return pref_max((*n).fr[s[i]-'a'],i+1);
}
int main()
{
while(cin>>task>>s){
if(task==0)
add(n,0);
else if(task==1)
cut(n,0);
else if(task==2)
cout<<get_number(n,0)<<'\n';
else
cout<<pref_max(n,0)<<'\n';
}
return 0;
}