Cod sursa(job #31821)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 16 martie 2007 16:42:10
Problema ADN Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.78 kb
# include <stdio.h>
# include <string.h>

const int
	  MAXNRSEC=18,
//	  MAXLEN=300,
	  MAXLEN=30010,
	  MAXINT=32000;

int n,a[MAXNRSEC+1][MAXNRSEC+1],crtsuf=0,crtsuf2=0,sol[MAXNRSEC+1];

char sequence[MAXNRSEC+1][MAXLEN+10];
char *sufarr[MAXLEN+1], *sufarr2[MAXLEN+1];

void populate (char stas);
int update_population();
int dist(char *s1, char *s2);
void copy_sufarr();
void citire();
void det_dist_all();

void back()
{
//all permutations of N elements such as that the
//total sum has the greatest magnitude
int v[MAXNRSEC+1]={0},k=1,sum=0,sel[MAXNRSEC+1]={0},i;
do
{
while (v[k]<=n-1)
	{
	if (v[k])
		{
		if (k>1) sum-=a[v[k-1]][v[k]];
		sel[v[k]]--;
		}
	v[k]++;
	sel[v[k]]++;
	if (k>1) sum+=a[v[k-1]][v[k]];
	if (sel[v[k]]==1)
		{
		if (k==n)
			{
			if (sum>sol[0])
				{
				sol[0]=sum;
				for (i=1;i<=n;i++) sol[i]=v[i];
				}
			}
		else
			{
			k++;
			v[k]=0;
			}
		}
	}
if (k>1) sum-=a[v[k-1]][v[k]];
sel[v[k]]--;
v[k]=0;
k--;
} while (k);
}

void scrie()
{
int i;
FILE *g=fopen("adn.out","w");
fprintf(g,"%s",sequence[sol[1]]);
for (i=2;i<=n;i++)
	fprintf(g,"%s",sequence[sol[i]]+a[sol[i-1]][sol[i]]);
fprintf(g,"\n");
fcloseall();
}

int main()
{
citire();
det_dist_all();
//back();
scrie();
return 0;
}

void citire()
{
FILE *f=fopen("adn.in","r");
fscanf(f,"%d",&n);
fgets(sequence[0],100,f);
sequence[0][0]='\0';
int i,aux,ok,j;
for (i=1;i<=n;i++)
	{
	fgets(sequence[i],MAXINT,f);
	aux=strlen(sequence[i]);
	sequence[i][aux-1]=sequence[i][aux];
	}
//checking for duplicates
i=1;
while (i<=n)
	{
	ok=0;
	for (j=1;j<=n;j++)
		if (j!=i)
			if (strstr(sequence[j],sequence[i])!=NULL)
				{
				strcpy(sequence[i],sequence[n]);
				sequence[n][0]='\0';
				n--;
				ok=1;
				break;
				}
	if (!ok) i++;
	}
fclose(f);
}

void det_dist_all()
{
int i,j;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
	if (i!=j)
		a[i][j]=dist(sequence[i],sequence[j]);
}

void copy_sufarr()
{
crtsuf=crtsuf2;
int i;
for (i=1;i<=crtsuf;i++) sufarr[i]=sufarr2[i];
}

int dist(char *s1, char *s2)
{
char *q=s2;
int i,sol=0,aux;
crtsuf=strlen(s1);
for (i=0;i<=crtsuf-1;i++) sufarr[i+1]=s1+i;
while (*q)
	{
	populate(*q); //populate sufarr2[] based on a character from q;
	aux=update_population(); //update the population in sufarr2[] and check for mins/maxs
	if (aux==1) sol=q-s2+1;
	copy_sufarr(); //copy the population from sufarr2 to sufarr;
	q++;
	}
return sol;
}

void populate (char stas)
{
crtsuf2=0;
int i;
for (i=1;i<=crtsuf;i++)
	if (*(sufarr[i])==stas)
		sufarr2[++crtsuf2]=sufarr[i];
}

int update_population()
{
int i=1,ok=0;
while(i<=crtsuf2)
	{
	sufarr2[i]++;
	if (*(sufarr2[i])=='\0')
		{
		ok=1;
		sufarr2[i]=sufarr2[crtsuf2];
		crtsuf2--;
		}
	else
		i++;
	}
return ok;
}