AcWing 无. 折叠子串
原题链接
困难
作者:
wjslyk
,
2024-09-10 17:42:55
,
所有人可见
,
阅读 1
#include <bits/stdc++.h>
using namespace std;
const int N=110,INF=110;
string s;
int f[N][N]; //从i到j的子串折叠后的最小长度
string str[N][N]; //记录折叠后的字符串
int check(int l,int k,int r)
{
if(k-l+1 > r-k) return 0;
int i,j;
int cnt=0;
for(i=k+1,j=l;i<=r;){
if(s[i]==s[j]){
i++; j++;
if(j>k) { j=l; cnt++; }
}
else return 0;
}
if(j==l) return cnt;
else return 0;
}
int main()
{
while(cin>>s){
int n=s.length();
// 初始化
for(int i=0;i<=n-1;i++){
f[i][i]=1; str[i][i]=s[i];
}
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<=n-1;j++){
//求解f[i][j]
int minf=j-i+1;
string s1;
for(int k=i;k<j;k++){
// minf=min(minf, f[i][k]+f[k+1][j]); //直接并在一起
if(f[i][k]+f[k+1][j]<=minf){
minf=f[i][k]+f[k+1][j];
s1=str[i][k]+str[k+1][j];
}
if(check(i,k,j)){ //i..k是k+1..j的循环子串,返回值为循环次数
int tmp=to_string(check(i,k,j)+1).length();
// minf=min(minf, tmp+f[i][k]+2 );
if(tmp+f[i][k]+2 <minf){
minf=tmp+f[i][k]+2;
s1=to_string(check(i,k,j)+1)+'('+str[i][k]+')';
}
}
}
f[i][j]=minf;
str[i][j]=s1;
}
}
//输出结果
// cout<<f[0][n-1]<<endl;
cout<<str[0][n-1]<<endl;
}
return 0;
}