#include<stdio.h>
#include<string.h>
int main()
{
char s[57];
int dp[6][57][57],n;
int mid;
int i,j,k;
scanf("%s",s+1);
n=strlen(s+1);
for(i=1;i<n+1;++i)
{
dp[0][i][i]=1;
dp[1][i][i]=99999999;
}
for(i=n;i>0;--i)
for(j=i+1;j<n+1;++j)
{
dp[0][i][j]=dp[1][i][j]=j-i+1;
for(k=i;k<j;++k)
dp[1][i][j]=(dp[0][i][k]*(dp[0][i][k]<dp[1][i][k]+1)+dp[1][i][k]*(dp[0][i][k]>dp[1][i][k])+dp[0][k+1][j]*(dp[0][k+1][j]<dp[1][k+1][j]+1)+dp[1][k+1][j]*(dp[0][k+1][j]>dp[1][k+1][j])+1)*((dp[0][i][k]*(dp[0][i][k]<dp[1][i][k]+1)+dp[1][i][k]*(dp[0][i][k]>dp[1][i][k])+dp[0][k+1][j]*(dp[0][k+1][j]<dp[1][k+1][j]+1)+dp[1][k+1][j]*(dp[0][k+1][j]>dp[1][k+1][j])+1)<dp[1][i][j]+1)+dp[1][i][j]*(dp[1][i][j]<(dp[0][i][k]*(dp[0][i][k]<dp[1][i][k]+1)+dp[1][i][k]*(dp[0][i][k]>dp[1][i][k])+dp[0][k+1][j]*(dp[0][k+1][j]<dp[1][k+1][j]+1)+dp[1][k+1][j]*(dp[0][k+1][j]>dp[1][k+1][j])+1));
for(k=i;k<j;++k)
dp[0][i][j]=dp[0][i][j]*(dp[0][i][j]<(dp[0][i][k]+j-k))+(dp[0][i][k]+j-k)*(!(dp[0][i][j]<(dp[0][i][k]+j-k)));
if(!((j-i+1)&1))
{
mid=(i+j)>>1;
k=i;
while(k<mid+1)
{
if(s[k]!=s[mid+1+k-i])
break;
++k;
}
dp[0][i][j]=dp[0][i][j]*(k!=mid+1)+(dp[0][i][(i+j)>>1]+1)*(k==mid+1);
}
}
printf("%d",dp[0][1][n]*(dp[0][1][n]<dp[1][1][n]+1)+dp[1][1][n]*(dp[1][1][n]<dp[0][1][n]));
return 0;
}
对n长度的原始字符串进行压缩的前提是字符串左边存在隐藏M,从而选择左边隐藏M的区间字符串被压缩的最短长度作为最优解。