Pagini recente » Cod sursa (job #959743) | Cod sursa (job #15011) | Cod sursa (job #2094425) | Cod sursa (job #1861150) | Cod sursa (job #389604)
Cod sursa(job #389604)
#include<cstdio>
#include<cstring>
using namespace std;
const char iname[]="trie.in";
const char oname[]="trie.out";
struct trie
{
int v;
trie *nodes[26];
int sons;
trie()
{
memset(nodes,0,sizeof(nodes));
v=sons=0;
}
} *root=new trie();
int n,i,j;
char s[34];
void insert(trie *nod,char *s)
{
if(*s<'a'||*s>'z')
{
++nod->v;
return;
}
if(nod->nodes[*s-'a']==0)
nod->nodes[*s-'a']=new trie(),++nod->sons;
insert(nod->nodes[*s-'a'],s+1);
}
bool del(trie *nod,char *s)
{
if(*s<'a'||*s>'z')
{
--nod->v;
}
else if(del(nod->nodes[*s-'a'],s+1))
{
nod->nodes[*s-'a']=0;
--nod->sons;
}
if(nod->v==0&&nod->sons==0&&nod!=root)
{
delete nod;
return true;
}
return false;
}
int query(trie *nod,char *s)
{
if(*s<'a'||*s>'z')
return nod->v;
if(nod->nodes[*s-'a'])
return query(nod->nodes[*s-'a'],s+1);
return 0;
}
int lcp(trie *nod,char *s,int k)
{
if(*s<'a'||*s>'z'||nod->nodes[*s-'a']==0)
return k;
return lcp(nod->nodes[*s-'a'],s+1,k+1);
}
int main()
{
freopen(iname,"r",stdin);
freopen(oname,"w",stdout);
fgets(s,sizeof(s),stdin);
while(!feof(stdin))
{
switch(s[0])
{
case '0':insert(root,s+2); break;
case '1':del(root,s+2); break;
case '2':printf("%d\n",query(root,s+2)); break;
case '3':printf("%d\n",lcp(root,s+2,0)); break;
}
fgets(s,sizeof(s),stdin);
}
fclose(stdin);
fclose(stdout);
return 0;
}