Cod sursa(job #304304)

Utilizator luk17Luca Bogdan luk17 Data 11 aprilie 2009 22:56:01
Problema Trie Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include<stdio.h>
#include<string.h>
struct nod
{
	int nr;
	char inf;
	nod* leg[27];
};
nod *start;
nod* creare(char inf)
{
	nod *p=new nod();
	p->nr=1;
	p->inf=inf;
	for(int i=0;i<26;i++)
		p->leg[i]=NULL;
	return p;
}
void add(nod* p,char inf)
{
	int val=inf-'a';
  if(p->leg[val]==NULL)
  {
	  nod *q=creare(inf);
	  p->leg[val]=q;
  }
}
void add(nod *p, char* inf)
{
	int n=strlen(inf);
	for(int i=0;i<n;i++)
	{
		if(p->leg[inf[i]-'a']==NULL)
			add(p,inf[i]);
		else
			p->leg[inf[i]-'a']->nr++;
		p=p->leg[inf[i]-'a'];
	}
}
void sterge(nod* p,char* inf)
{
	if(inf[0]!=0&&p)
	if(p->leg[inf[0]-'a']->nr==1)
	{
		nod *q=p->leg[inf[0]-'a'];
		p->leg[inf[0]-'a']=NULL;
		sterge(q,inf+1);
		delete(q);
	}
	else
	{
		p->leg[inf[0]-'a']->nr--;
		nod *q=p->leg[inf[0]-'a'];
		sterge(q,inf+1);
	}
}
int nr_ap(char* inf)
{
	int n=strlen(inf), numar=0,sum=0,i;
	nod *p=start;
	for(i=0;i<n&&p->leg[inf[i]-'a'];i++)
	{
		p=p->leg[inf[i]-'a'];
		numar=p->nr;
	}
	if(i!=n)
		return 0;
	for(i=0;i<26;i++)
		if(p->leg[i])
		sum+=p->leg[i]->nr;
	return numar-sum;
	
}
int prefix(char* inf)
{
	int i;
	int n=strlen(inf);
	nod *p=start;
	for(i=0;i<n&&p->leg[inf[i]-'a'];i++)
		if(p->leg[inf[i]-'a']->nr==1)
			return i+1;
		else
			p=p->leg[inf[i]-'a'];

	return i;
}
int main()
{
	int cod;
	char aux[1000];
	
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	start=creare('*');
//	scanf("%d %s",&cod,aux);
	while(!feof(stdin))
	{
		scanf("%d %s\n",&cod,aux);		
		switch(cod)
		{
		case 0: add(start,aux);break;
		case 1: sterge(start,aux);break;
		case 2: printf("%d\n",nr_ap(aux));break;
		case 3: printf("%d\n",prefix(aux));break;
		}
	}

	return 0;
}