qwq,调了好久了。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int INF=999999999;
string s;
int n,f[51][51][2];
void check(int a,int b,int l){
l=(b-a+1)/l;
for(int i=a;i<=b;i++){
if(s[(i-a)%l+a]!=s[i]){
return ;
}
}
if(a!=1)f[a][b][1]=min(f[a][b][1],(int)(log2((b-a+1)/l))+l+1);
else f[a][b][1]=min(f[a][b][1],(int)(log2((b-a+1)/l))+l);
}
signed main(){
cin>>s;
n=s.size();
s=' '+s;
for(int i=1;i<=n;i++){f[i][i][0]=1;f[i][i][1]=INF;}
for(int len=2;len<=n;len++){
for(int i=1;i+len-1<=n;i++){
int j=i+len-1;
f[i][j][0]=len;
f[i][j][1]=INF;
for(int k=i;k<j;k++)f[i][j][1]=min(f[i][j][1],min(f[i][k][0],f[i][k][1])+min(f[k+1][j][0],f[k+1][j][1]));
for(int k=2;k<=len/2;k*=2){
if(len%k!=0)break;
check(i,j,k);
}
}
}
cout<<min(f[1][n][0],f[1][n][1]);
return 0;
}