思路:
将序列首位相接,题目即求环上的最长交错字段。
为什么可以这样做呢?
(图丑勿喷)
比如说假设我们将序列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;
}