暴力
先将01字符串转化成记录连续的0或1长度的数组,比如000011记录成sum[0]=4,sum[1]=2,指代四个0,两个1
然后比较将连续的0或1边缘的数字取反后乘积之和与原来的乘积之和的大小(代码中体现为计算差值,差值恒<0则不用改变,否则取差值最大的)
明明很简单的题,我却一直卡在了printf输出格式上orz,一直用%ld输出long long结果wa声一片_(´ཀ`」 ∠)_,改回%lld就过了。
代码如下:
#include <iostream>
#include <cstdio>
#include <string.h>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll long long
int main()
{
int t;
ios::sync_with_stdio(false);
cin>>t;
char c[100010];
ll sum[100010];
int len;
for(int h=1; h<=t; h++)
{
ll cnt=1,k=0;
scanf("%s",c);
memset(sum,0,sizeof(sum));
len=strlen(c);
c[len]='*';
ll ans=0;
for(int i=1; i<=len; i++)
{
if(c[i-1]==c[i])
cnt++;
else
{
sum[k++]=cnt;
ans+=cnt*cnt;
cnt=1;
}
}
ll temp=0;
for(int i=0;i<k-1;i++)
{
ll tmp;
if(sum[i]!=1||i==0)
{
tmp=2*abs(sum[i]-sum[i+1])+2;
temp=max(tmp,temp);
}
else if(sum[i]==1)
{
tmp=2*(sum[i-1]*sum[i+1]+sum[i-1]+sum[i+1]);
temp=max(tmp,temp);
}
}
printf("Case #%d: %lld\n",h,ans+temp);
}
return 0;
}