Pagini recente » Cod sursa (job #1927081) | Cod sursa (job #1054146) | Cod sursa (job #1942095) | Cod sursa (job #2536960) | Cod sursa (job #1474453)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
vector<int>ram;
int post=2;
struct trie
{
int sfarsit;
int nrap;
int aparitie[27];
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].aparitie[ch[i]-'a']==0)
{
a[nod].aparitie[ch[i]-'a']=1;
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;
bool as=0;
for(int i=0;i<lun;i++)
{
int temp=a[nod].fiu[ch[i]-'a'];
if(as==1)
{
a[nod].fiu[ch[i]-'a']=0;
a[nod].aparitie[ch[i]-'a']=0;
as=0;
}
nod=temp;
a[nod].nrap--;
if(a[nod].nrap==0)
{
ram.push_back(nod);
as=1;
}
}
a[nod].sfarsit--;
}
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].aparitie[ch[i]-'a']==1)
{
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();
}
}