Cod sursa(job #63114)

Utilizator Gaby_mMititelu Gabriel Gaby_m Data 26 mai 2007 18:34:14
Problema ADN Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.47 kb
#include <fstream.h>
#include <string.h>
#include <stdlib.h>
struct nod
{
	char *inf;
	char *coresp;
	nod *link;
};
int transform(char *&inf, char *&coresp)
{
	int n=strlen(inf);
	coresp=(char *) malloc(sizeof(char)*(n+1));
	for(int i=0; i<n; i++)
	{
		if(inf[i]>='a' && inf[i]<='c') { coresp[i]='2'; continue; }
		if(inf[i]>='d' && inf[i]<='f') { coresp[i]='3'; continue; }
		if(inf[i]>='g' && inf[i]<='h') { coresp[i]='4'; continue; }
		if(inf[i]>='k' && inf[i]<='l') { coresp[i]='5'; continue; }
		if(inf[i]>='m' && inf[i]<='n') { coresp[i]='6'; continue; }
		if(inf[i]>='p' && inf[i]<='s') { coresp[i]='7'; continue; }
		if(inf[i]>='t' && inf[i]<='v') { coresp[i]='8'; continue; }
		if(inf[i]>='w' && inf[i]<='y') { coresp[i]='9'; continue; }
		if(inf[i]>='i' && inf[i]<='j') { coresp[i]='1'; continue; }
		coresp[i]='0';
	}
	coresp[n]=0;
	return 1;
}
int nod_add(nod *&a, char *&p)
{
	nod *nou=(nod *) malloc(sizeof(nod));
	int n=strlen(p);
	nou->inf=(char *) malloc(sizeof(char)*(n+1));
	strcpy(nou->inf,p);
	transform(p,nou->coresp);
	nou->link=a;
	a=nou;
	return 1;
}
int nod_del(nod *&a)
{
	nod *q;
	while(a)
	{
		q=a;
		a=a->link;
		delete(q);
	}
	return 1;
}
char * nod_search(nod *a, char *&p)
{
	//cout<<"Incercari: ";
	while(a)
	{
		//cout<<a->coresp<<" ";
		if(strcmp(p,a->coresp)==0) { return a->inf; }
		a=a->link;
	}
	//cout<<endl;
	return NULL;
}
int afisare(nod ***w)
{
	for(int i=0; i<50; i++)
		for(int j=0; j<10; j++)
		{
			nod *q=w[i][j];
			//cout<<i<<" "<<j<<": ";
			while(q)
			{
				//cout<<q->inf<<" ";
				q=q->link;
			}
			//cout<<endl;
		}
	return 1;
}
char * functie(nod ***&w, char *&p)
{
	//cout<<"P-ul este: "<<p<<endl;
	int n=strlen(p);
	if(!n) return p;
	for(int i=n-1; i>=0; i--)
	{
		char *q=(char *) malloc(sizeof(char)*(i+2));
		char *q1=(char *) malloc(sizeof(char)*(i+2));
		strncpy(q,p,i+1);
		q[i+1]=0;
		//cout<<"Prefixul extras este: "<<q<<endl;
		//cout<<"Verificare in "<<i<<" "<<int(p[0])-48<<" "<<endl;
		q1=nod_search(w[i][int(p[0])-48],q);
		if(q1) 
		{
			strcpy(q,q1);
			strncpy(q1,&p[i+1],n-1-i);
			q1[n-1-i]=0;
			//cout<<"Noul sir, sufixul primului este "<<q1<<";"<<endl;
			if(strlen(q1)>0)
			{
			char * k=functie(w,q1);
			if(k) 
				{
					char *d=(char *) malloc(sizeof(char)*(strlen(k)+2+strlen(q)));
					d=strcat(q," ");
					d=strcat(d,k);
					return d;
				}
			}
			else  return q;
		}
		free(q);
	}
	return NULL;
}
int citire(istream &in, ostream &out, nod ***&w)
{
	for(int i=0; i<50; i++)
	{
		for(int j=0; j<10; j++)
		{
			//nod_del(w[i][j]);
			w[i][j]=NULL;
		}
	}
	char *a=(char *) malloc(sizeof(char)*50);
	char *b=(char *) malloc(sizeof(char)*50);
	int n;
	in.get(a,50);
	if(strcmp(a,"-1")==0) return 0;
	in.get();
	in>>n;
	for(i=0; i<n; i++)
	{
		in.get();
		in.get(b,50);
		int m=strlen(b);
		char *q;
		transform(b,q);
		//cout<<m-1<<" "<<int(q[0])-48<<" "<<b<<endl;
		nod_add(w[m-1][int(q[0])-48],b);
	}
	in.get();
	//afisare(w);
	char *p=functie(w,a);
	if(p) out<<p<<endl;
	else out<<"No solution."<<endl;
	return 1;
}
int init(nod ***&w)
{
	for(int i=0; i<50; i++)
	{
		w[i]=(nod **) malloc(sizeof(nod *)*10);
		for(int j=0; j<10; j++)
			w[i][j]=NULL;
	}
	return 1;
}
int main()
{
	nod ***w;
	w=(nod ***) malloc(sizeof(nod **)*50);
	init(w);
	//ifstream f("input");
	//ofstream g("output");
	int k=0;
	do
	{
	k=citire(cin,cout,w);
	}
	while(k==1);
	//f.close();
	//g.close();
	return 1;
}