Pagini recente » Cod sursa (job #2295571) | Cod sursa (job #1743871) | Cod sursa (job #1116876) | Cod sursa (job #1282826) | Cod sursa (job #44993)
Cod sursa(job #44993)
#include <stdio.h>
#include <string>
#include <stdlib.h>
#define maxn 2010
#define maxl 4
#define maxc 9
#define maxv 10000
char a[maxn];
int p[maxn];
int n;
short c[maxl][maxn],d[maxl][maxn];
short from[maxn][maxn];
char sol[maxn];
int q[maxc],r[maxc],b[maxc];
int main()
{
freopen("elimin2.in","r",stdin);
freopen("elimin2.out","w",stdout);
int i,j,x,y,k,aux,max=0;
char ch;
fgets(a,maxn,stdin);
n=strlen(a)-2;
for (i=maxc;i>0;i--)
{
for (j=0;j<=n;j++)
if (a[j]-'0'==i) break;
for (k=n;k>=0;k--)
if (a[k]-'0'==i) break;
q[i]=j;
r[i]=k+1-j;
}
p[0]=0;
for (i=1;i<=n+1;i++)
{
p[i]=p[i-1]+1;
if (p[i]==maxl) p[i]=0;
}
for (i=0;i<maxl;i++)
for (j=0;j<=n;j++) c[i][j]=maxv;
for (i=0;i<=n;i++)
for (j=0;j<=n;j++) from[i][j]=maxv;
for (i=0;i<=n;i++)
{
c[1][i]=0;
d[1][i]=a[i]-'0';
}
for (i=0;i<n;i++)
if (a[i]==a[i+1])
{
c[2][i]=0;
d[2][i]=a[i]-'0';
}
else c[2][i]=2;
for (i=1;i<=n+1;i++)
{
for (x=0;x<=n;x++)
{
if (i+2<=n+1) c[p[i+2]][x]=maxv;
if (i+3<=n+1) c[p[i+3]][x]=maxv;
}
for (x=0;x+i-1<=n;x++)
{
y=i+x-1;
if ((x>0) && (y<n) && (a[x-1]==a[y+1]) && ((c[p[i]][x]<c[p[i+2]][x-1]) || ((c[p[i]][x]==c[p[i+2]][x-1]) && (a[x-1]-'0'>d[p[i+2]][x-1]))))
{
c[p[i+2]][x-1]=c[p[i]][x];
d[p[i+2]][x-1]=a[x-1]-'0';
from[i+2][x-1]=i;
}
if ((x>0) && ((c[p[i]][x]+1<c[p[i+1]][x-1]) || ((c[p[i]][x]+1==c[p[i+1]][x-1]) && (d[p[i]][x]>d[p[i+1]][x-1]))))
{
c[p[i+1]][x-1]=c[p[i]][x]+1;
d[p[i+1]][x-1]=d[p[i]][x];
from[i+1][x-1]=-i;
}
if ((y<n) && ((c[p[i]][x]+1<c[p[i+1]][x]) || ((c[p[i]][x]+1==c[p[i+1]][x]) && (d[p[i]][x]>d[p[i+1]][x]))))
{
c[p[i+1]][x]=c[p[i]][x]+1;
d[p[i+1]][x]=d[p[i]][x];
from[i+1][x]=i;
}
}
for (j=1;j<=maxc;j++)
if (i==r[j]) b[j]=c[p[i]][q[j]];
}
for (i=maxc;i>0;i--)
if (r[i]-b[i]>max)
{
max=r[i]-b[i];
x=q[i];
y=x+r[i]-1;
}
i=y+1-x;
j=0;
k=max-1;
while (i!=maxv)
{
aux=from[i][x];
if (aux>=0)
if ((i-aux==2) || (aux==maxv))
{
sol[j++]=a[x++];
sol[k--]=a[y--];
}
else y--;
else x++;
if (aux>=0) i=aux;
else i=-aux;
}
for (i=0;i<max;i++)
if (sol[i]!=sol[max-i-1]) exit(2);
for (i=0;i<max;i++) printf("%c",sol[i]);
printf("\n");
return 0;
}