Cod sursa(job #637238)
#include<fstream>
#include<algorithm>
using namespace std;
char a[501],b[501];
int d[1024][1024];
char sir[501],l[501];
int bst,bst1;
int main()
{
int i=1, j;
ifstream f("palm.in");
ofstream g("palm.out");
char c;
while(f>>c)
a[i]=c,++i;
int n=i;
for(i=1;i<=n;++i)
b[n-i]=a[i];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i]==b[j])
d[i][j]=1+d[i-1][j-1];
else
d[i][j]=max(d[i-1][j],d[i][j-1]);
i=n;
j=n;
bst=0;
while(i)
if (a[i]==b[j] )
{
sir[bst++]=a[i];
--i;
--j;
}
else
if (d[i-1][j]<d[i][j-1])
--j;
else
--i;
if((bst-1)%2==0)
bst=(bst-1)/2;
else
bst=(bst-1)/2+1;
int poz[501];
int k,m,p,pp;
p=0;
for(k=1;k<=bst;++k)
{
i=1;
j=p;
pp=0;
while(i<=j)
{
m=(i+j)/2;
if(l[m]>sir[k])
{
pp=m;
j=m-1;
}
else
if(l[m]<=sir[k])
i=m+1;
else
{
pp=m;
break;
}
}
if(pp==0)
{
++p;
pp=p;
}
l[pp]=sir[k];
poz[k]=pp;
}
bst1=bst;
for(i=p;i>=0;--i)
{
while(poz[bst]!=i && bst)
--bst;
l[i]=sir[bst];
}
if(bst1%2==0)
g<<p*2;
else
g<<p*2-1;
return 0;
}