Kingdom of Black and White

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define ll long long
#define MAX 1000001
const ll N = 1e5+7;
const ll mod = 1e9+7;
using namespace std;
ll q[N];
int main(){
    int t;scanf("%d",&t);
    for(int _=1;_<=t;++_){
        memset(q,0,sizeof(q));
        string s;
        int p=0,l=0;
        cin>>s;
        int n=s.length();
        for(int i=0;i<n;++i){
            if(s[i]!=s[i+1]){
                q[++p]=i-l+1;
                l=i+1;
            }
        }//原贡献 
        ll y=0; 
        for(int i=1;i<=p;++i)
            y=y+q[i]*q[i];
        ll ans=y;
        
        //改变块的长度不为1
        if(p>=2){
            ll ans1=0;    //改变量 
            for(int i=1;i<p;++i)
                ans1=max(ans1,abs(q[i]-q[i+1]));
            if(2*ans1+2>0)    ans=ans+2*ans1+2;
        }
        
        //改变块长度为1
        if(p>=3){
            ll ans2=0;    //改变量 
            for(int i=2;i<p;++i){
                if(q[i]!=1)    continue;
                ll a=q[i-1],b=q[i+1];
                ans2=max(ans2,a*b+a+b);
            }
            if(ans2>0)    ans=max(ans,y+ans2*2);
        }
        printf("Case #%d: %lld
",_,ans);
    }
    return 0;   
}
原文地址:https://www.cnblogs.com/PdrEam/p/14518617.html