E. String Multiplication dp
作者:互联网
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=5e5+1000; ll dp[N][30]; char s[N]; int main() { int n;cin>>n; for(int i=1;i<=n;i++) { scanf("%s",s+1); int len=strlen(s+1),cnt=1,qz=1,hz=1; for(int j=1;j<=len;j++) { if(s[j]==s[j+1]) cnt++; else dp[i][s[j]-'a']=max(dp[i][s[j]-'a'],1ll*cnt),cnt=1; } for(int j=2;j<=len;j++) if(s[j]==s[1]) qz++; else break; for(int j=len-1;j;j--) if(s[j]==s[len]) hz++; else break; if(i-1) { if(qz==len) { dp[i][s[1]-'a']=max(dp[i][s[1]-'a'],len*(dp[i-1][s[1]-'a']+1)+dp[i-1][s[1]-'a']); } else if(s[1]==s[len]) { if(dp[i-1][s[1]-'a']) { dp[i][s[1]-'a']=max(dp[i][s[1]-'a'],1ll*qz+hz+1); } } else { dp[i][s[1]-'a']=max(dp[i][s[1]-'a'],1ll*!!dp[i-1][s[1]-'a']+qz); dp[i][s[len]-'a']=max(dp[i][s[len]-'a'],1ll*!!dp[i-1][s[len]-'a']+hz); } } for(int j=0;j<26;j++) dp[i][j]=max(dp[i][j],1ll*!!dp[i-1][j]); } ll ans=0; for(int i=0;i<26;i++) ans=max(ans,dp[n][i]); cout<<ans; }View Code
dp[i][j]表示前i个字符组合完毕时字符为j的最大连续长度
标签:String,int,ll,long,char,5e5,Multiplication,dp 来源: https://www.cnblogs.com/bxd123/p/12234147.html