CF1789F
数据范围很小,不妨考虑对于
对于
这部分复杂度似乎是
你再考虑对于
在
于是枚举
#include<bits/stdc++.h>
using namespace std;
int n,m,f[85][85],g[85][85][85],ans; char s[85],t[85];
inline int lcs2(int l1,int r1,int l2,int r2){
for(int i=l1-1;i<=r1+1;i++)
for(int j=l2-1;j<=r2+1;j++)
f[i][j]=0;
for(int i=l1;i<=r1;i++)
for(int j=l2;j<=r2;j++)
f[i][j]=max(max(f[i][j-1],f[i-1][j]),f[i-1][j-1]+(s[i]==s[j]));
return f[r1][r2];
}
inline int lcs3(int l1,int r1,int l2,int r2,int l3,int r3){
for(int i=l1-1;i<=r1+1;i++)
for(int j=l2-1;j<=r2+1;j++)
for(int k=l3-1;k<=r3+1;k++)
g[i][j][k]=0;
for(int i=l1;i<=r1;i++)
for(int j=l2;j<=r2;j++)
for(int k=l3;k<=r3;k++)
g[i][j][k]=max(max(g[i][j][k-1],max(g[i][j-1][k],g[i-1][j][k])),g[i-1][j-1][k-1]+(s[i]==s[j]&&s[i]==s[k]));
return g[r1][r2][r3];
}
inline int check(){
int ans=0;
for(int i=1,j=1;i<=n;i++)
if(s[i]==t[j]){
j++;
if(j==m+1) j=1,ans++;
}
return ans>1?ans*m:0;
}
int main(){
scanf("%s",s+1); n=strlen(s+1);
for(int i=1;i<n;i++) ans=max(ans,2*lcs2(1,i,i+1,n));
for(int i=1;i<n;i++)
for(int j=i+1;j<n;j++)
ans=max(ans,3*lcs3(1,i,i+1,j,j+1,n));
for(int i=1;i<=n;i++){
for(int sta=1;sta<(1<<16);sta+=2){
m=0;
for(int j=0;j<16&&i+j<=n;j++)
if(sta&(1<<j)) t[++m]=s[i+j];
ans=max(ans,check());
}
}
printf("%d\n",ans);
return 0;
}