Pagini recente » Borderou de evaluare (job #437152) | Borderou de evaluare (job #329702) | Borderou de evaluare (job #1632287) | Borderou de evaluare (job #2437358) | Cod sursa (job #350105)
Cod sursa(job #350105)
#include<stdio.h>
#include<string.h>
int m;
char s[25];
struct nod
{
nod *u[28];
long nc,pf;
};
nod *t;
void init(nod *t)
{
int i;
for (i=0;i<26;i++)
t->u[i]=0;
t->nc=0;
t->pf=0;
}
void insert()
{
int i;
nod *p,*aux;
p=t;
for (i=0;i<m-1;i++)
{
if (p->u[s[i]-'a'])
{
p=p->u[s[i]-'a'];
p->pf++;
}
else
{
aux=new nod;
init(aux);
p->u[s[i]-'a']=aux;
p=aux;
p->pf++;
}
}
if (p->u[s[i]-'a'])
{
p=p->u[s[i]-'a'];
p->nc++;
p->pf++;
}
else
{
aux=new nod;
init(aux);
p->u[s[i]-'a']=aux;
p=aux;
p->nc++;
p->pf++;
}
}
void del(nod *p,int i)
{
if (i==m)
return;
p->pf--;
del(p->u[s[i]-'a'],i+1);
if (p->u[s[i]-'a']->pf==0)
delete(p);
}
void nrap()
{
int i;
nod *p;
p=t;
for (i=0;i<m;i++)
{
p=p->u[s[i]-'a'];
}
printf("%ld\n",p->nc);
}
void prefix()
{
int i;
long l=0;
nod *p;
p=t;
for (i=0;i<m;i++)
{
if (p->u[s[i]-'a'])
{
p=p->u[s[i]-'a'];
if (p->pf)
l++;
else
{
printf("%ld\n",l);
return;
}
}
else
{
printf("%ld\n",l);
return;
}
}
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
t=new nod;
init(t);
while (scanf("%s",&s)!=EOF)
{
switch (s[0])
{
case '0':{scanf("%s",s);m=strlen(s);insert();break;}
case '1':{scanf("%s",s);m=strlen(s);del(t,0);break;}
case '2':{scanf("%s",s);m=strlen(s);nrap();break;}
case '3':{scanf("%s",s);m=strlen(s);prefix();break;}
}
}
return 0;
}