Cod sursa(job #349738)

Utilizator IoannaPandele Ioana Ioanna Data 21 septembrie 2009 14:04:55
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<stdio.h>
#include<string.h>
int m;
char s[25];

struct nod
{
	nod *u[26];
    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()
{
    int i;
	nod *p;
	p=t;
	for (i=0;i<m;i++)
	{
		p=p->u[s[i]-'a'];
		p->pf--;
	}
	p->nc--;
}

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();break;}
	    case '2':{scanf("%s",s);m=strlen(s);nrap();break;}
	    case '3':{scanf("%s",s);m=strlen(s);prefix();break;}
		}
	}
	return 0;
}