链接: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; }