Codeforces Round #505 C Plasticine zebra (cf 1025C)

题目:Plasticine zebra

思路:
将序列首位相接,题目即求环上的最长交错字段。
为什么可以这样做呢?
这里写图片描述
(图丑勿喷)
比如说假设我们将序列abcdef从bc处截断并翻转得到第二行的序列得到,可以发现,序列bafedc变成环形后等价于fedcba。由于是求01序列的最长交错子串,变更后的串也就等价于abcdef。同理将第二个串从ed间截断并翻转得到第3个串,也等价于环形上的abcdef。
注意,当原序列本来就是交错的时,要特殊判断。

代码:

#include<bits/stdc++.h>
using namespace std;

#define maxn 100000

int n;
char a[maxn+5];

int main() {
    scanf("%s",a);
    n=strlen(a);
    for(int i=n;i>=1;i--) a[i]=a[i-1];
    a[0]=0;
    int len=0,pre=1,suf=1;
    for(int i=2;i<=n;i++) {
        if(a[i]==a[i-1]) break;
        pre++;
    }
    for(int i=n-1;i>=1;i--) {
        if(a[i]==a[i+1]) break;
        suf++;
    }
    if(suf==n) {
        printf("%d",n);
        return 0;
    }
    if(a[1]!=a[n]) len=pre+suf;
    int s=0;
    for(int i=1;i<=n;i++) {
        if(a[i]==a[i-1]) {
            s=1;
        } else s++;
        len=max(len,s);
    }

    printf("%d",max(len,max(pre,suf)));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值