ID:15521201
LANG:C++
PROG:beads
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char neckless[500];
int n;
int main()
{
freopen("beads.in","r",stdin);
freopen("beads.out","w",stdout);
int left(char t,int m);
int right(char t,int m);
int i,j,sum,t,single;
char temp;
cin>>n>>neckless;
for(i=0,single=0;i<n;i++)
{
if(single==0&&neckless[i]!='w')
{
single=1;
temp=neckless[i];
}
else if(single==1&&neckless[i]!='w'&&neckless[i]!=temp)
{
single=2;
temp=neckless[i];
}
else if(single==2&&neckless[i]!='w'&&neckless[i]!=temp)
{
single=3;
break;
}
}
if(single==3)
{
temp='0';
for(i=0,sum=0;i<n;i++)
{
if(neckless[i]!='w'&&neckless[i]!=temp)
{
t=left(neckless[i],i)+right(neckless[i],i);
sum=(sum>t)?sum:t;
temp=neckless[i];
}
}
}
else sum=n;
cout<<sum<<endl;
return 0;
}
int left(char t,int m)
{
int i,sum;
for(i=m-1,sum=0;i!=m;i--)
{
if(i==-1)i=n-1;
if(neckless[i]!=t)
sum++;
else if(neckless[i]==t)
break;
}
return (sum);
}
int right(char t,int m)
{
int i,sum;
for(i=m+1,sum=1;i!=m;i++)
{
if(i==n)i=0;
if(neckless[i]==t||neckless[i]=='w')
sum++;
else if(neckless[i]!=t||neckless[i]!='w')
break;
}
return (sum);
}
思路就是在至少为(r~~~w~~~r或者w~~~r~~~w的格式下),当找到一次转变时(转变:前一非‘w’字符为‘r’,第一次穿线‘b’或相反),从该字符左边
第一位开始循环到出现和该字符相同为止,把其中的‘w’和与它不同的字符出现数代为left,同理,从该字符右边第一位开始循环到出现于该字符不同的字符
且不为‘w’为止,把其中的‘w’和与它相同的字符字符出现数代为right。
吧left和right相加,求每次的最大值。