Pagini recente » Cod sursa (job #2842617) | Cod sursa (job #2007684) | Cod sursa (job #1776567) | Cod sursa (job #1683028) | Cod sursa (job #1772776)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct trie
{
int nrcuv,nrfii;
vector<int> v;
trie()
{
nrcuv=nrfii=0;
v.resize(26);
}
};
vector<trie> arb;
char cuv[22];
int d=0;
void add(char cuv[21])
{
int nod=0;
int l=strlen(cuv);
for(int i=0;i<l;i++)
{
arb[nod].nrfii++;
if(arb[nod].v[cuv[i]-'a']==0)
{
arb.push_back(trie());
arb[nod].v[cuv[i]-'a']=arb.size()-1;
}
nod=arb[nod].v[cuv[i]-'a'];
}
arb[nod].nrcuv++;
arb[nod].nrfii++;
}
void sterge(char cuv[21])
{
int nod=0;
int l=strlen(cuv);
for(int i=0;i<l;i++)
{
arb[nod].nrfii--;
nod=arb[nod].v[cuv[i]-'a'];
}
arb[nod].nrcuv--;
arb[nod].nrfii--;
}
int gaseste(char cuv[21])
{
int nod=0;
int l=strlen(cuv);
for(int i=0;i<l;i++)
{
if(arb[nod].v[cuv[i]-'a']==0) return 0;
nod=arb[nod].v[cuv[i]-'a'];
}
return arb[nod].nrcuv;
}
int prefix(char cuv[21])
{
int nod=0;
int l=strlen(cuv);
int r=0;
for(int i=0;i<l;i++)
{
if(arb[nod].v[cuv[i]-'a']==0) break;
nod=arb[nod].v[cuv[i]-'a'];
if(arb[nod].nrfii>0) r=i+1;
}
return r;
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int tip;
arb.push_back(trie());
while(!feof(stdin))
{
scanf("%d %s",&tip,cuv);
if(tip==0) add(cuv);
else if(tip==1) sterge(cuv);
else if(tip==2) printf("%d\n",gaseste(cuv));
else if(tip==3) printf("%d\n",prefix(cuv));
}
return 0;
}