Pagini recente » Cod sursa (job #451996) | Cod sursa (job #116226) | Cod sursa (job #485643) | Cod sursa (job #3234068) | Cod sursa (job #1875361)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
vector<int>ram;
int post=2;
struct trie
{
int sfarsit;
int nrap;
int fiu[27];
}a[120005];
char ch[50];
void add()
{
int lun=strlen(ch);
int nod=1;
for(int i=0;i<lun;i++)
{
if(a[nod].fiu[ch[i]-'a']==0)
{
if(ram.empty())
{
a[nod].fiu[ch[i]-'a']=post;
post++;
}
else
{
a[nod].fiu[ch[i]-'a']=ram.back();
ram.pop_back();
}
}
nod=a[nod].fiu[ch[i]-'a'];
a[nod].nrap++;
}
a[nod].sfarsit++;
}
void rem()
{
int lun=strlen(ch);
int nod=1;
for(int i=0;i<lun;i++)
{
nod=a[nod].fiu[ch[i]-'a'];
a[nod].nrap--;
}
a[nod].sfarsit--;
nod=1;
for(int i=0;i<lun;i++)
{
int temp=a[nod].fiu[ch[i]-'a'];
if(a[temp].nrap==0)
{
ram.push_back(temp);
a[nod].fiu[ch[i]-'a']=0;
}
nod=temp;
}
}
void check()
{
int lun=strlen(ch);
int nod=1;
for(int i=0;i<lun;i++) nod=a[nod].fiu[ch[i]-'a'];
printf("%d\n",a[nod].sfarsit);
}
void pref()
{
int lun=strlen(ch);
int nod=1,ct=0;
for(int i=0;i<lun;i++)
{
if(a[nod].fiu[ch[i]-'a']!=0)
{
ct++;
nod=a[nod].fiu[ch[i]-'a'];
if(a[nod].nrap==0)
{
ct--;
break;
}
}
else break;
}
printf("%d\n",ct);
}
int main()
{
freopen ("trie.in","r",stdin);
freopen ("trie.out","w",stdout);
int op;
while(1)
{
scanf("%d%s",&op,ch);
if(feof(stdin)) break;
if(op==0) add();
else if(op==1) rem();
else if(op==2) check();
else pref();
}
}