【题目】http://codeforces.com/contest/1025/problem/C
【题意】现在有一个字符串,有一种操作:找到一个间隔,让这两边的各自翻转:abaa|ab -> aababa
问经过任意次操作后,得到的wb交替出现的子串最大长度是多少?
【思路】最多翻转一次,并且开头结尾一样的也不能翻转。那么求一下原串的最大长度;如果开头结尾不同,再求一下头上的最长和尾上的最长。注意特判头尾接上的(整个串都是wbwbwb)。
【代码】
#include<bits/stdc++.h>
#define fuck(x) std::cout<<"["<<#x<<"->"<<x<<"]"<<endl;
using namespace std;
const int M=1e5+5;
char a[M];
int main()
{
scanf("%s",a);
int n=strlen(a);
int ans=0;
//先找如果不改变原串时,目标子串的最大长度
int temp=1;//长度从1开始
for(int i=0; i<n-1; i++)
{
if(a[i]!=a[i+1])//只要和前面的不同,那么就能++
temp++;
else//否则恢复temp
temp=1;
ans=max(ans,temp);
//fuck(temp);
}
ans=max(ans,temp);//n==1的进不了上面的循环,处理一下
if(a[0]==a[n-1]||ans==n)
//如果第一个字符和最后一个相同,那么操作肯定没有用。
//如果整个串已经是wbwbwb这样的,肯定不会再增加。
printf("%d\n",ans);
else
{
//翻转最多一次,就是将前面的wbwbwb和后面的wbwbwb接起来的长度
int temp1=1,temp2=1;
for(int i=0; i<n-1; i++)//开头的wbwbwb
{
if(a[i]!=a[i+1])
temp1++;
else
break;
}
for(int i=n-1; i>=1; i--)//结尾的wbwbwb
{
if(a[i]!=a[i-1])
temp2++;
else
break;
}
//fuck(temp1);fuck(temp2);fuck(ans);
printf("%d\n",max(ans,temp1+temp2));//取最大值
}
}