Cod sursa(job #637611)
using namespace std;
#include<iostream>
#include<fstream>
#include<cstring>
ofstream fout("palm.out");
char a[510];
int N;
struct nod{
int p,s;};
nod v[260100];
int dp[260100];
int h[100],hi[100];
int maxi(char dummy,int p,int s)
{
int castu;
castu=(int)(dummy-'a');
int ans=0,i;
for(i=0;i<=castu;i++)
{
if(hi[i]==0 || (p>v[hi[i]].p && s<v[hi[i]].s) )
ans=max(ans,h[i]);
}
return ans;
}
void update(char dummy,int value,int i)
{
int castu;
castu=(int)(dummy-'a');
h[castu]=max(value,h[castu]);
if(h[castu]==value)
hi[castu]=i;
}
void scmax()
{
int ans=0;
int maxim,i;
for(i=0;i<=50;i++)
{
h[i]=0;
hi[i]=0;
}
for(i=1;i<=N;i++)
{
maxim=maxi(a[v[i].p],v[i].p,v[i].s);
dp[i]=maxim+((v[i].s==v[i].p)?1:2);
update(a[v[i].p],dp[i],i);
ans=max(ans,dp[i]);
//cout<<maxim<<" "<<((v[i].s==v[i].p)?1:2)<<" "<<dp[i]<<"\n";
}
/*cout<<"\n";
for(i=0;i<=50;i++)
{
cout<<h[i]<<" ";
}
cout<<"\n";*/
fout<<ans<<"\n";
}
void build()
{
int i,j,M=0;
for(i=1;i<=N;i++)
{
for(j=1;j<=N-i;j++)
{
if(a[i]==a[N-j+1])
{
v[++M].p=i;
v[M].s=N-j+1;
}
}
}
for(i=1;i<=N;i++)
{
v[++M].p=i;
v[M].s=i;
}
N=M;
/*for(i=1;i<=N;i++)
{
cout<<v[i].p<<" "<<v[i].s<<"\n";
}*/
}
void cit()
{
ifstream fin("palm.in");
fin.getline(a+1,505);
N=strlen(a+1);
//cout<<a+1<<"\n"<<N<<"\n";
fin.close();
}
int main()
{
cit();
build();
scmax();
fout.close();
return 0;
}