题目
nozomi看到eli在字符串的“花园”里迷路了,决定也去研究字符串问题。
她想到了这样一个问题:
对于一个 “01” 串而言,每次操作可以把 0 字符改为 1 字符,或者把 1 字符改为 0 字符。所谓 “01” 串,即只含字符 0 和字符 1 的字符串。
nozomi有最多 次操作的机会。她想在操作之后找出一个尽可能长的连续子串,这个子串上的所有字符都相同。
nozomi想问问聪明的你,这个子串的长度最大值是多少?
注: 次操作机会可以不全部用完。
如果想知道连续子串的说明,可以去问问eli,nozomi不想再讲一遍。
题解
显然操作要不就是把尽可能多的 1 变成 0 ,要不就是把尽可能多的 0 变成 1 。取这两种情况的最优值即可。
对于 0 变 1 的情况,可以统计每个 1 的连续前缀 1 的位置和连续后缀 1 的位置。然后进行枚举,即连续变化 k 个 0 ,最后通过连续后缀 1 的位置和连续前缀 1 的位置得出答案。
对于 1 变0 的情况,同理。
代码
v0记录着每个字符 0 的下标,更重要的是,v0也意味着每个 1 的连续前缀位置和连续后缀位置。
v1记录着每个字符 1 的下标,更重要的是,v1也意味着每个 0 的连续前缀位置和连续后缀位置。
#include<bits/stdc++.h> using namespace std; string s; vector<int>v0,v1; int main() { int i,n,j,k,ans=-1; scanf("%d%d",&n,&k); cin>>s; v0.push_back(-1); v1.push_back(-1); for(i=0;i<s.size();i++) { if(s[i]=='0') v0.push_back(i); else v1.push_back(i); } v0.push_back(n); v1.push_back(n); if(v0.size()<=k||v1.size()<=k) printf("%d",n); else { for(i=1,j=k;j<v0.size()-1;i++,j++) ans=max(ans,v0[j+1]-v0[i-1]-1); for(i=1,j=k;j<v1.size()-1;i++,j++) ans=max(ans,v1[j+1]-v1[i-1]-1); printf("%d",ans); } system("pause"); return 0; }
来源:https://www.cnblogs.com/VividBinGo/p/12289336.html