Pagini recente » Cod sursa (job #405914) | Cod sursa (job #2414339) | Cod sursa (job #1165074) | Profil DranaXum | Cod sursa (job #243524)
Cod sursa(job #243524)
#include <stdio.h>
#include <io.h>
#define IN "trie.in"
#define OUT "trie.out"
FILE *fin=fopen(IN,"r");
FILE *fout=fopen(OUT,"w");
struct nod
{
int val;
nod *l[30];
};
nod *trie;
void add(char *s);
void del(char *s);
void init(nod *q);
int search(char *s);
int pref(char *s);
int main()
{
int op;
char cuv[30];
init(trie);
while(!feof(fin))
{
fscanf(fin,"%d",&op);
fscanf(fin,"%s",&cuv);
if(op==0)
add(cuv);
else
if(op==1)
del(cuv);
else
if(op==2)
fprintf(fout,"%d\n",search(cuv));
else
if(op==3)
fprintf(fout,"%d\n",pref(cuv));
}
fclose(fin);
fclose(fout);
return 0;
}
void add(char *s)
{
nod *p,*q=trie;
int i;
int transf;
for(i=0;s[i];i++)
{
transf=s[i]-96;
if(q->l[transf])
q=q->l[transf];
else
{
p=new nod;
init(p);
q->l[transf]=p;
q=p;
}
}
q->val++;
}
void del(char *s)
{
nod *q=trie;
int i,j;
int transf;
int ult;
for(i=0;s[i];i++)
{
transf=s[i]-96;
for(j=1;j<=28;j++)
if(q->l[j] && j!=transf)
ult=i;
if(q->l[transf])
q=q->l[transf];
}
if(q->val)
{
q->val--;
return;
}
q=trie;
for(i=0;(s[i] && i!=ult);i++)
{
transf=s[i]-96;
if(q->l[transf])
q=q->l[transf];
}
transf=s[i]-96;
q->l[transf]=NULL;
}
int search(char *s)
{
nod *q=trie;
int i;
int transf;
for(i=0;s[i];i++)
{
transf=s[i]-96;
if(q->l[transf])
q=q->l[transf];
else
break;
}
if(s[i])
return 0;
return q->val;
}
int pref(char *s)
{
nod *q=trie;
int i;
int transf;
int sol=0;
for(i=0;s[i];i++)
{
transf=s[i]-96;
if(q->l[transf])
{
sol=i+1;
q=q->l[transf];
}
else
break;
}
return sol;
}
void init(nod *q)
{
int i;
q->val=0;
for(i=1;i<=28;i++)
q->l[i]=NULL;
}