Cod sursa(job #637438)
#include <cstdio>
#include <string>
#include <algorithm>
#include <fstream>
using namespace std;
#define MAXN 512
string S;
int i,len,j,p,q,N,L,Lmax;
int mem[MAXN][MAXN],P[MAXN][MAXN],Ind[MAXN][MAXN];
ifstream fin("palm.in");
ofstream fout("palm.out");
int caut(int a, int b) {
if(a>b) return 0;
if(a==b && S[a]>=S[a-1]) return 1;
if(mem[a][b]>=0) return mem[a][b];
int i,j,R=0;
for(i=a;i<b;++i) {
if(S[i]<S[a-1]) continue;
if(R==0) R=1;
j=Ind[i][b];
if(j<=i) continue;
R=max(R,2+caut(i+1,j-1));
}
return mem[a][b]=R;
}
int main() {
fin >> S;
N=S.size();
//while(S[N-1]<'a' || S[N-1]>'z') N--;
for(i=0;i<N-1;++i)
for(j=i+1;j<N;++j) {
if(S[i]==S[j])
P[i][++P[i][0]]=j;
Ind[i][j]=P[i][P[i][0]]; // <=j
mem[i][j]=-1;
}
Lmax=1;
for(i=0;i<N-1;++i) {
q=P[i][0];
if(q==0) continue;
j=P[i][q];
if(j<=i) continue;
L=2+caut(i+1,j-1);
Lmax=max(Lmax,L);
}
fout << Lmax;
}