题目描述
给一个长度为 n 的 01 序列
s
[
1
]
,
s
[
2
]
,
.
.
.
.
,
s
[
n
]
s[1],s[2],....,s[n]
s[1],s[2],....,s[n],现在可以至多进行 1 次如下操作:
选择
1
≤
x
<
n
1≤x<n
1≤x<n,将 s 序列变成
s
[
x
+
1
]
,
s
[
x
+
2
]
,
.
.
.
.
.
s
[
n
]
,
s
[
1
]
,
s
[
2
]
,
.
.
.
.
s
[
x
]
s[x+1],s[x+2],.....s[n],s[1],s[2],....s[x]
s[x+1],s[x+2],.....s[n],s[1],s[2],....s[x]。
输出最长的全为 1 的子区间长度。
输入描述:
一个 01 字符串,表示序列 s。
(
1
<
=
∣
s
∣
<
=
100000
)
(1<= |s| <= 100000)
(1<=∣s∣<=100000)
输出描述:
输出一个整数表示答案。
示例1
输入
1001
输出
2
示例2
输入
11111
输出
5
示例3
输入
10111010
输出
3
解题思路
选择是否将字符串中前一段移到末尾,求最长地连续‘1’的长度,很明显这段拼接不会影响中间连续1的长度。所以最长的连续‘1’的长度为 max(中间连续‘1’的长度,首尾连续‘1’长度的和)。
PS:如果首尾连续字符‘1’的长度和超过字符串的长度,答案只取字符串的长度。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<cmath>
using namespace std;
string s;
int k,t,ans,lyx;
int main(){
cin>>s;
ans=-1;
for(int i=0;i<s.size();i++)
{
if(s[i]=='0'&&t!=0)
{
ans=max(ans,t);
t=0;
}
else if(s[i]=='1') t++;
}
ans=max(ans,t);
for(int i=0;i<s.size();i++)
if(s[i]=='0')
{
lyx+=i-0;
break;
}
if(lyx==s.size())
{
printf("%d",ans);
return 0;
}
for(int i=s.size()-1;i>0;i--)
if(s[i]=='0')
{
lyx+=s.size()-i-1;
break;
}
printf("%d",max(ans,lyx));
}