Pagini recente » Cod sursa (job #2938190) | Cod sursa (job #473611) | Cod sursa (job #2933738) | Cod sursa (job #1659413) | Cod sursa (job #420127)
Cod sursa(job #420127)
#include <cstdio>
#include <cstring>
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;
memset(tr,0,sizeof tr);
}
};
trie *T=new trie;
void add(trie *&nod,char *c)
{
if(*c=='\0'||*c=='\n')
{
nod->x++;
return;
}
int h=*c-'a';
if(nod->tr[h]!=NULL)
//nod->fii++;
add(nod->tr[h],++c);
else
{
nod->tr[h]=new trie;
nod->fii++;
add(nod->tr[h],++c);
}
}
int del(trie *&nod,char *c)
{
if(*c=='\n'||*c=='\0')
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=='\0'||*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=='\0'||*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;
}