Pagini recente » Cod sursa (job #3227245) | Cod sursa (job #1073977) | Cod sursa (job #2331903) | Cod sursa (job #1921478) | Cod sursa (job #2198573)
#include <bits/stdc++.h>
using namespace std;
int c;
string cuv;
char aux[25];
struct nod
{
int counter,howmany;
nod *son[26];
nod()
{
counter=0;
howmany=0;
memset(son,0,sizeof(son));
}
};
nod *jmek=new nod;
void add(nod *parent,int pos)
{
if(pos==cuv.size())
{
parent->counter++;
return;
}
if(parent->son[cuv[pos]-'a']==0)
{
parent->son[cuv[pos]-'a']=new nod;
parent->howmany++;
}
add(parent->son[cuv[pos]-'a'],pos+1);
}
bool pop(nod *parent,int pos)
{
if(pos==cuv.size())
parent->counter--;
else
{
if(pop(parent->son[cuv[pos]-'a'],pos+1))
{
parent->son[cuv[pos]-'a']=0;
parent->howmany--;
}
}
if(parent->counter==0 && parent->howmany==0 && parent!=jmek)
{
delete parent;
return 1;
}
return 0;
}
int count_them(nod *parent,int pos)
{
if(pos==cuv.size())
return parent->counter;
if(parent->son[cuv[pos]-'a']==0)
return 0;
return count_them(parent->son[cuv[pos]-'a'],pos+1);
}
int largest_prefix(nod *parent,int pos)
{
if(pos==cuv.size())
return pos;
if(parent->son[cuv[pos]-'a']==0)
return pos;
return largest_prefix(parent->son[cuv[pos]-'a'],pos+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
while(!feof(stdin))
{
scanf("%d %s\n",&c,aux);
cuv=string(aux);
if(c==0)
{
add(jmek,0);
continue;
}
if(c==1)
{
pop(jmek,0);
continue;
}
if(c==2)
{
printf("%d\n",count_them(jmek,0));
continue;
}
printf("%d\n",largest_prefix(jmek,0));
}
return 0;
}