Pagini recente » Cod sursa (job #3275217) | Cod sursa (job #252285) | Cod sursa (job #3262756) | Cod sursa (job #4270) | Cod sursa (job #247288)
Cod sursa(job #247288)
#include <stdio.h>
#include <iostream.h>
#define IN "trie.in"
#define OUT "trie.out"
FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");
struct Trie
{
int cnt,nrfii;
Trie *fiu[30];
Trie()
{
cnt=nrfii=0;
memset(fiu,0,sizeof(fiu));
}
};
Trie *T=new Trie;
void ins(Trie *nod,char *s);
int pre(Trie *nod,char *s,int k);
int que(Trie *nod,char *s);
int del(Trie *nod,char *s);
int main()
{
char cuv[100];
int op;
while(!feof(fin))
{
fscanf(fin,"%d ",&op);
fscanf(fin,"%s\n",&cuv);
switch(op)
{
case 0: ins(T,cuv); break;
case 1: del(T,cuv); break;
case 2: fprintf(fout,"%d\n",que(T,cuv)); break;
case 3: fprintf(fout,"%d\n",pre(T,cuv,0)); break;
}
}
return 0;
}
void ins(Trie *nod,char *s)
{
if(*s==0)
{
nod->cnt++;
return;
}
int ch=*s-'a';
if(nod->fiu[ch]==0)
{
nod->fiu[ch]=new Trie;
nod->nrfii ++;
}
ins(nod->fiu[ch],s+1);
}
int pre(Trie *nod,char *s,int k)
{
if(*s==0 || nod->fiu[*s-'a']==0)
return k;
return pre(nod->fiu[*s-'a'],s+1,k+1);
}
int que(Trie *nod,char *s)
{
if(*s==0)
return nod->cnt;
if(nod->fiu[*s-'a'])
return que(nod->fiu[*s-'a'],s+1);
return 0;
}
int del(Trie *nod,char *s)
{
if(*s==0)
nod->cnt--;
else
if(del(nod->fiu[*s-'a'],s+1))
{
nod->fiu[*s-'a']=0;
nod->nrfii--;
}
if(nod->cnt==0 && nod->nrfii==0 && nod != T)
{
delete nod;
return 1;
}
return 0;
}