【题解】B-交换(7612. 2020牛客NOIP赛前集训营-普及组(第五场))

T2 交换

https://ac.nowcoder.com/acm/contest/7612/B

B-交换

思路

给定的字符串首尾相接就会成一个环,那么可以破环成列,在 s 的末尾在添加一个 s,以样例 10111010 为例,处理过后则变成了 1011101010111010,那么这样就可以找出最长的全为 的子区间长度。

注意当给定的字符串全为 时,有可能会出现 的情况,按照题意, ,所以当 '1' 时,递推式为

最终的答案就是

代码

#include<bits/stdc++.h>

using namespace std;

int main() {
    int ans = 0, cnt = 0;
    string s;
    cin >> s;
    int n = s.size()-1;
    s += s;
    int i = 0, f[200005];
    memset(f, 0x00, sizeof(f));
    for(int i = 1 ; i < s.size() ; i++) {
        if(s[i] == '1') {
            f[i] = min(f[i-1]+1, n);
        }
    }
    for(int i = 0 ; i <= 2*n ; i++) {
        ans = max(f[i], ans);
    }
    cout << ans << endl;
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-24 14:18
点赞 评论 收藏
分享
让资本家给我当牛做马:26的秋招还没开始啊?你找的是实习?实习的话你马上就研三了为什么还要实习?
点赞 评论 收藏
分享
牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务