B-交换
思路
给定的字符串首尾相接就会成一个环,那么可以破环成列,在 s 的末尾在添加一个 s,以样例 10111010 为例,处理过后则变成了 1011101010111010,那么这样就可以找出最长的全为 的子区间长度。
注意当给定的字符串全为 时,有可能会出现
的情况,按照题意,
,所以当
为
'1' 时,递推式为 。
最终的答案就是
代码
#include<bits/stdc++.h>
using namespace std;
int main() {
int ans = 0, cnt = 0;
string s;
cin >> s;
int n = s.size()-1;
s += s;
int i = 0, f[200005];
memset(f, 0x00, sizeof(f));
for(int i = 1 ; i < s.size() ; i++) {
if(s[i] == '1') {
f[i] = min(f[i-1]+1, n);
}
}
for(int i = 0 ; i <= 2*n ; i++) {
ans = max(f[i], ans);
}
cout << ans << endl;
return 0;
} 
京公网安备 11010502036488号