题目链接
每次最多修改一个点。
按照连通区域进行计数,每次修改就是区域的端点
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define cl(a,b) memset(a,b,sizeof(a))
#define pb push_back
const int maxn = 100005;
const int inf = 1<<28;
const LL mod = 1000000007;
char s[maxn];
vector<LL> v;
LL f(LL x){return x*x;}
int main(){
int T;scanf("%d",&T);
int cas=1;
while(T--){
v.clear();
scanf("%s",s);
int n=strlen(s);
LL ans=0;
LL ans2=0;
int len=0;int flag=-1;
for(int i=0;i<n;i++){
if(s[i]-'0'!=flag){
v.pb(len);
len=1;
flag=s[i]-'0';
}
else len++;
}
v.pb(len);v.pb(0);
for(int i=1;i<v.size()-1;i++){
ans+=v[i]*v[i];
}
ans2=ans;
for(int i=1;i<v.size()-1;i++){
if(v[i]==1){
ans2=max(ans2,ans-1-f(v[i-1])-f(v[i+1]) + f(v[i-1]+1+v[i+1]) );
}
else {
ans2=max(ans2,ans-f(v[i-1])-f(v[i])+f(v[i-1]+1)+f(v[i]-1) );
ans2=max(ans2,ans-f(v[i])-f(v[i+1]) + f(v[i]-1) + f(v[i+1]+1) );
}
}
printf("Case #%d: %lld\n",cas++,max(ans,ans2));
}
return 0;
}