Pagini recente » Cod sursa (job #2363595) | Cod sursa (job #1170984) | Cod sursa (job #1366091) | Cod sursa (job #120544) | Cod sursa (job #420114)
Cod sursa(job #420114)
#include <cstdio>
using namespace std;
FILE *f=fopen("trie.in","r");
FILE *g=fopen("trie.out","w");
char s[100];
struct trie
{
int fii,x;
trie *tr[26];
trie()
{
fii=x=0;
for(int i=0;i<26;i++)
tr[i]=NULL;
}
};
trie *T=new trie;
void add(trie *&nod,char *c)
{
if(*c=='\n')
{
nod->x++;
return;
}
int h=*c-'a';
if(nod->tr[h]!=NULL)
{
nod->fii++;
add(nod->tr[h],++c);
}
else
{
//trie *p=new trie;
nod->tr[h]=new trie;
nod->fii++;
add(nod->tr[h],++c);
}
}
int del(trie *&nod,char *c)
{
if(*c=='\n')
nod->x--;
else if(del(nod->tr[int(*c-'a')],c+1)==1)
{
nod->tr[int(*c-'a')]=0;
nod->fii--;
}
if(nod->fii==0 && nod!=T && nod->x==0)
{
delete nod;
return 1;
}
return 0;
}
int query(trie *nod,char *c)
{
if (*c=='\n' )
return nod->x;
else
{
int h=*c-'a';
if(nod->fii!=0&&nod->tr[h]!=0)
return query(nod->tr[h],++c);
}
return 0;
}
int pref(trie *nod,char *c,int nr)
{
if(*c=='\n'||nod->tr[int(*c-'a')]==NULL)
return nr;
return pref(nod->tr[int(*c-'a')],c+1,nr+1);
}
int main()
{
while(fgets(s,100,f))
{
if(s[0]=='0') add(T,s+2);
else if(s[0]=='1') del(T,s+2);
else if(s[0]=='2') fprintf(g,"%d\n",query(T,s+2));
else if(s[0]=='3') fprintf(g,"%d\n",pref(T,s+2,0));
}
return 0;
}