链接:https://ac.nowcoder.com/acm/contest/7612/B
来源:牛客网

题目描述

给一个长度为 n 的 01 序列 s[1],s[2],....,s[n],现在可以至多进行 1 次如下操作:
选择 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

分析与思路:

选择是否将字符串中前一段移到末尾,求最长地连续‘1’的长度,很明显这段拼接不会影响中间连续1的长度,所以最长的连续‘1’的长度为 max(中间连续‘1’的长度,首尾连续‘1’长度的和)如果首尾连续字符‘1’的长度和超过字符串的长度,答案只取字符串的长度

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    cin>>s;
    int ls=s.size(),a=0,b=0,te,i,j;
    i=0;
    while(s[i]=='1'&&i<ls)++i,++a;
    j=ls-1;
    while(s[j]=='1'&&j>=0)++b,--j;
    int an=0;
    for(int k=i;k<=j;++k)
    {
        if(s[k]=='1')
        {
            int nu=0;
            while(s[k]=='1'&&k<=j)
                nu++,k++;
            an=max(an,nu);
        }
    }
    if(a+b>=ls)
        an=ls;
    else
        an=max(a+b,an);
    printf("%d\n",an);
    return 0;
}