Pagini recente » Cod sursa (job #743008) | Cod sursa (job #3254096) | Cod sursa (job #558813) | Cod sursa (job #1317413) | Cod sursa (job #828098)
Cod sursa(job #828098)
#include<stdio.h>
#include<cstring>
using namespace std;
FILE*f=fopen("trie.in","r");
FILE*g=fopen("trie.out","w");
int sol;
char v[26];
struct trie
{
int nr,nrfii;
trie *son[27];
trie()
{
nr=nrfii=0;
memset(son,0,sizeof(son));
}
} *p=new trie;
void insert (trie *nod,char *q)
{
if(*q=='\n')
{
++nod->nr;
return ;
}
if(nod->son[*q-'a'+1]==NULL)
{
nod->son[*q-'a'+1]=new trie;
++nod->nrfii;
}
insert(nod->son[*q-'a'+1],q+1);
}
int erase(trie *nod,char *q)
{
if(*q=='\n')
--nod->nr;
else if(nod->son[*q-'a'+1]&&erase(nod->son[*q-'a'+1],q+1))
{
--nod->nrfii;
nod->son[*q-'a'+1]=NULL;
}
if(nod->nr==0&&nod->nrfii==0&&nod!=p)
{
delete nod;
return 1;
}
return 0;
}
void nrap(trie *nod,char *q)
{
if(*q=='\n')
{
sol=nod->nr;
return ;
}
if(nod->son[*q-'a'+1])
nrap(nod->son[*q-'a'+1],q+1);
}
void pref(trie *nod,char *q)
{
++sol;
if(*q=='\n')
return ;
if(nod->son[*q-'a'+1]!=NULL)
pref(nod->son[*q-'a'+1],q+1);
}
int main()
{
while(fgets(v,25,f))
{
switch(v[0]-'0')
{
case 0: insert(p,v+2); break;
case 1: erase(p,v+2); break;
case 2:
{
sol=0;
nrap(p,v+2);
fprintf(g,"%d\n",sol);
break;
}
case 3:
{
sol=-1;
pref(p,v+2);
fprintf(g,"%d\n",sol);
break;
}
}
}
fclose(f);
fclose(g);
return 0;
}