来源:牛客网
题目描述
给一个长度为 n 的 01 序列 s[1],s[2],…,s[n],现在可以至多进行 1 次如下操作:
选择
1
≤
x
<
n
1\leq x < n
1≤x<n,将 s 序列变成 s[x+1],s[x+2],…s[n],s[1],s[2],…s[x]
输出最长的全为 1 的子区间长度。
输入描述:
一个 01 字符串,表示序列 s。(1<= |s| <= 100000)
输出描述:
输出一个整数表示答案。
示例1
输入
1001
输出
2
示例2
输入
11111
输出
5
示例3
输入
10111010
输出
3
解题思路
0 + 一串1 + 0
不管怎样操作,1串都无法和别的1串接在一起
一次操作的意义就是把开头的 一串1 + 0 和结尾的 0 + 一串1 接在一起
Code
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
string s;
int ans, x, y, sum;
int main(){
cin>>s;
while (s[x] == '1')
x++, y++;//x记录到第几位, y记录开头的1串
for (; x < s.size(); x++)
{
sum = 0;
while (s[x] == '1')
x++, sum++;
ans = max (ans, sum);
}
ans = max(ans,sum + y);//sum最终会记录结尾的1串 加上开头的1串(一次操作)
printf ("%d", ans);
}