Pagini recente » Cod sursa (job #205218) | Cod sursa (job #148848) | Cod sursa (job #1714561) | Cod sursa (job #831840) | Cod sursa (job #80564)
Cod sursa(job #80564)
# 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;
}