Pagini recente » Cod sursa (job #2438006) | Cod sursa (job #953538) | Cod sursa (job #2336527) | Cod sursa (job #1474061) | Cod sursa (job #1918654)
#include <bits/stdc++.h>
#define sigma 26
using namespace std;
int op;
char str[25];
struct trie
{
int cnt,nrfii;
trie *fiu[sigma];
trie()
{
cnt=nrfii=0;
memset(fiu,0,sizeof(fiu));
}
}*root=new trie();
void _insert(trie *nod,char *s)
{
if(*s=='\n'){
nod->cnt++;
return;
}
if(nod->fiu[*s-'a']==0)
{
nod->fiu[*s-'a']=new trie();
nod->nrfii++;
}
_insert(nod->fiu[*s-'a'],s+1);
}
bool _delete(trie *nod,char *s)
{
if(*s=='\n'){
nod->cnt--;
}
else if(_delete(nod->fiu[*s-'a'],s+1))
{
nod->fiu[*s-'a']=0;
nod->nrfii--;
}
if(!nod->nrfii && !nod->cnt && nod!=root)
{
delete nod;
return true;
}
return false;
}
int query(trie *nod,char *s)
{
if(*s=='\n')
return nod->cnt;
if(nod->fiu[*s-'a'])
return query(nod->fiu[*s-'a'],s+1);
return 0;
}
int LCP(trie *nod,char *s,int k)
{
if(*s=='\n' || nod->fiu[*s-'a']==0)
return k;
return LCP(nod->fiu[*s-'a'],s+1,k+1);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
fgets(str,sizeof(str),stdin);
while(!feof(stdin))
{
if(str[0]=='0')
_insert(root,str+2);
else if(str[0]=='1')
_delete(root,str+2);
else if(str[0]=='2')
printf("%d\n",query(root,str+2));
else printf("%d\n",LCP(root,str+2,0));
fgets(str,sizeof(str),stdin);
}
return 0;
}