分析:算出每一段的个数,贪心过去,注意段数为1的情况 和 段的元素和为1的情况
#include <cstdio>
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
typedef long long int LL;
#define maxn 100050
int T , n ;
char a[maxn];
LL sum[maxn];
int scnt;
LL s[maxn];
LL ans;
LL cal(int x,int y ,int z)
{
if( y == 1 )return (x+y+z)*(x+y+z);
return (x+1)*(x+1) + (y-1)*(y-1) + z*z;
}
LL cal2(int x,int y ,int z)
{
if( y == 1 )return (x+y+z)*(x+y+z);
return x*x + (y-1)*(y-1) + (z+1*z+1);
}
void deal()
{
for(int i = 1 ; i < scnt ; ++i)
{
if( i + 2 <= scnt ){
ans = max( ans , cal2( sum[i] , sum[i+1] , sum[i+2] ) + s[scnt] - s[i+2] + s[i-1] );
ans = max( ans , cal( sum[i] , sum[i+1] , sum[i+2] ) + s[scnt] - s[i+2] + s[i-1] );
}
else {
ans = max( ans , cal2( 0 , sum[i] , sum[i+1] ) + s[scnt] - s[i+1] + s[i-1] );
ans = max( ans , cal( sum[i] , sum[i+1] , 0 ) + s[scnt] - s[i+1] + s[i-1] );
}
}
}
int main()
{
cin >> T;
int cas = 0;
while(T--){
scnt = 0;
int x = -1, cnt = 1;
scanf("%s",a);
int len = strlen(a);
for(int i = 0 ; i < len ; ){
int temp = a[i];
int cnt = 0;
while( a[i] == temp && i < len ){
i++;
cnt++;
}
sum[++scnt] = cnt;
}
printf("Case #%d: ",++cas);
if( scnt == 1 ){
cout << sum[1]*sum[1] << endl;
continue;
}
for(int i = 1 ; i <= scnt ; ++i)
s[i] = s[i-1] + sum[i]*sum[i];
ans = s[scnt];
deal();
cout << ans << endl;
}
}