链接: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 的子区间长度。
选择 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;
}

京公网安备 11010502036488号