Cod sursa(job #80564)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 28 august 2007 17:02:28
Problema Elimin 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
# include <stdio.h>
# include <string.h>

const long int MAXL=2000;

char s[MAXL+10],s2[MAXL+10];
long int n;
char tata[MAXL+10][MAXL+10];
short c[MAXL+10][MAXL+1];
char cif[MAXL+10][MAXL+10];


void citire()
{
char aux;
long int i;
FILE *f=fopen("elimin2.in","r");
fgets(s+1,MAXL+10,f);
n=strlen(s+1);
s[n]=s[n+1];n--;
strcpy(s2+1,s+1);
for (i=1;i<=n/2;i++)
	{
	aux=s2[i];s2[i]=s2[n-i+1];s2[n-i+1]=aux;
	}
fclose(f);
}

void calculeaza()
{
long int i,j;
if (s[1]==s2[1])
	{
	c[1][1]=1;
	tata[1][1]=2;
	cif[1][1]=s[1];
	}
else
	{
	c[1][1]=0;
	tata[1][1]=1;
	cif[1][1]='x';
	}
for (i=2;i<=n;i++)
	{
	if (s[i]==s2[1])
		{
		c[i][1]=1;
		tata[i][1]=2;
		cif[i][1]=s2[1];
		}
	else
		{
		c[i][1]=c[i-1][1];
		tata[i][1]=1;
		cif[i][1]=cif[i-1][1];
		}
	if (s[1]==s2[i])
		{
		c[1][i]=1;
		tata[1][i]=2;
		cif[1][i]=s[1];
		}
	else
		{
		c[1][i]=c[1][i-1];
		tata[1][i]=3;
		cif[1][i]=cif[1][i-1];
		}
	}
for (i=2;i<=n;i++)
	for (j=2;j<=n;j++)
		{
		c[i][j]=c[i-1][j];
		cif[i][j]=cif[i-1][j];
		tata[i][j]=1;
		if (c[i][j]<c[i][j-1]||(c[i][j]==c[i][j-1]&&cif[i][j]<cif[i][j-1]))
			{
			c[i][j]=c[i][j-1];
			cif[i][j]=cif[i][j-1];
			tata[i][j]=3;
			}
		if (s[i]==s2[j]&&(c[i][j]<c[i-1][j-1]+1||(c[i][j]==c[i-1][j-1]+1&&cif[i][j]<cif[i-1][j-1])))
			{
			c[i][j]=c[i-1][j-1]+1;
			cif[i][j]=s[i];
			tata[i][j]=2;
			}
		}
}

void scrie()
{
FILE *g=fopen("elimin2.out","w");
long int i,j,besti,bestj;
besti=1;bestj=1;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
	if (cif[i][j]!='0'&&c[i][j]>c[besti][bestj]||(c[i][j]==c[besti][bestj]&&cif[i][j]>cif[besti][bestj]))
		{
		besti=i;
		bestj=j;
                }
i=besti;
j=bestj;
while (i&&j)
	{
	if (s[i]==s2[j]) fprintf(g,"%c",s[i]);
	switch (tata[i][j])
		{
		case 2: i--;j--;break;
		case 1: i--; break;
		case 3: j--; break;
		}
	}
fprintf(g,"\n");
fcloseall();
}

int main()
{
citire();
calculeaza();
scrie();
return 0;
}