题目:Plasticine zebra
思路:
将序列首位相接,题目即求环上的最长交错字段。
为什么可以这样做呢?
(图丑勿喷)
比如说假设我们将序列abcdef从bc处截断并翻转得到第二行的序列得到,可以发现,序列bafedc变成环形后等价于fedcba。由于是求01序列的最长交错子串,变更后的串也就等价于abcdef。同理将第二个串从ed间截断并翻转得到第3个串,也等价于环形上的abcdef。
注意,当原序列本来就是交错的时,要特殊判断。
代码:
#include<bits/stdc++.h>
using namespace std;#define maxn 100000int 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;
}