Pagini recente » Cod sursa (job #2010975) | Profil Ovidiu-Antonio | Cod sursa (job #1592022) | Cod sursa (job #2479929) | Cod sursa (job #930735)
Cod sursa(job #930735)
#include<stdio.h>
#include<cstring>
using namespace std;
#define nmax 2005
long c, i, n, ult[11], p, lgmax, poz, v[nmax], nc, inc, sf, sfan, incan, l, j, p1, p2, lgac;
short ant[nmax][11], urm[nmax][11], lg[nmax][nmax];
char s[nmax];
void init()
{
for (c=0;c<=9;c++)
ult[c]=-5;
for (i=0;i<n;i++)
{
for (c=0;c<=9;c++)
ant[i][c]=ult[c];
ult[s[i]-'0']=i;
}
for (c=0;c<=9;c++)
ult[c]=-5;
for (i=n-1;i>=0;i--)
{
for (c=0;c<=9;c++)
urm[i][c]=ult[c];
ult[s[i]-'0']=i;
}
for (i=0;i<=n;i++)
for (j=i;j<=n;j++)
lg[i][j]=lg[j][i]=-5;
lgmax=1;
for (i=0;i<n;i++)
{
lg[i][i]=1;
if (urm[i][s[i]-'0']>-5)
{
lg[i][urm[i][s[i]-'0']]=2;
if (s[i]!='0')
lgmax=2;
}
}
}
void calculare()
{
for (l=2;l<=n;l++)
for (i=0;i+l-1<n;i++)
{
j=i+l-1;
if ((s[i]==s[j])&&(lg[i][j]<lg[i+1][j-1]+2)&&(lg[i+1][j-1]>-5))
{
lg[i][j]=lg[i+1][j-1]+2;
if ((lg[i][j]>lgmax)&&(s[i]>'0'))
lgmax=lg[i][j];
}
if (lg[i][j]<lg[i+1][j])
lg[i][j]=lg[i+1][j];
if (lg[i][j]<lg[i][j-1])
lg[i][j]=lg[i][j-1];
p=ant[j][s[i]-'0'];
if (p>-5)
if (lg[i][j]<lg[i+1][p-1]+2)
lg[i][j]=lg[i+1][p-1]+2;
p=urm[i][s[j]-'0'];
if (p>-5)
if (lg[i][j]<lg[p+1][j-1]+2)
lg[i][j]=lg[p+1][j-1]+2;
}
}
void afisare()
{
for (c=9;c>=1;c--)
{
inc=urm[0][c];
if (c==s[0]-'0')
inc=0;
if (inc>-5)
{
sf=ant[n-1][c];
if (s[n-1]-'0'==c)
sf=n-1;
if (lg[inc][sf]==lgmax)
{
printf("%ld",c);
v[++nc]=c;
break;
}
}
}
lgac=lgmax-2;
while (lgac>0)
{
sfan=sf; incan=inc;
for (c=9;c>=0;c--)
{
inc=urm[incan][c]; sf=ant[sfan][c];
if ((inc>-5)&&(inc<=sf))
if (lg[inc][sf]==lgac)
{
printf("%ld",c); v[++nc]=c;
break;
}
}
lgac-=2;
}
if (lgmax%2==0)
printf("%ld",v[nc]);
nc--;
while (nc>0)
{ printf("%ld",v[nc]); nc--; }
}
int main()
{
freopen("elimin2.in","r",stdin);
freopen("elimin2.out","w",stdout);
gets(s); n=strlen(s);
init();
calculare();
afisare();
// printf("\n%ld",lgmax);
return 0;
}