Pagini recente » Cod sursa (job #1191855) | Cod sursa (job #167134) | Cod sursa (job #1712179) | Cod sursa (job #29003) | Cod sursa (job #2374251)
#include <bits/stdc++.h>
using namespace std;
struct trie
{
int nrcuv,nr;
vector<int> v;
trie()
{
v.resize(26);
nrcuv=nr=0;
}
};
vector<trie> arb;
char sir[22];
void add_trie()
{
int l=strlen(sir+1),nod=0;
for(int i=1;i<=l;i++)
{
arb[nod].nr++;
if(arb[nod].v[sir[i]-'a']==0)
{
arb.push_back(trie());
arb[nod].v[sir[i]-'a']=arb.size()-1;
}
nod=arb[nod].v[sir[i]-'a'];
}
arb[nod].nrcuv++;
arb[nod].nr++;
}
void del_trie()
{
int l=strlen(sir+1),nod=0;
for(int i=1;i<=l;i++)
{
arb[nod].nr--;
nod=arb[nod].v[sir[i]-'a'];
}
arb[nod].nrcuv--;
arb[nod].nr--;
}
int count_trie()
{
int l=strlen(sir+1),nod=0;
for(int i=1;i<=l;i++)
{
if(arb[nod].v[sir[i]-'a']==0) return 0;
nod=arb[nod].v[sir[i]-'a'];
}
return arb[nod].nrcuv;
}
int lcp_trie()
{
int l=strlen(sir+1),nod=0;
for(int i=1;i<=l;i++)
{
if(arb[nod].v[sir[i]-'a']==0) return i-1;
nod=arb[nod].v[sir[i]-'a'];
if(arb[nod].nr==0) return i-1;
}
return l;
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
int t;
arb.push_back(trie());
while(!feof(stdin))
{
scanf("%d %s\n",&t,sir+1);
if(t==0) add_trie();
else if(t==1) del_trie();
else if(t==2) printf("%d\n",count_trie());
else printf("%d\n",lcp_trie());
}
return 0;
}