article
破碎的项链
你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=350),珠子是随意安排的. 这里是 n=29 的二个例子: 1 2 1 2 r b b r b r r b r b b b r r b r r r w r b r w w b b r r b b b b b b r b r r b r b r r r b r r r r r r b r b r r r w 图片 A 图片 B r 代表 红色的珠子 b 代表 蓝色的珠子 w 代表 白色的珠子 第一和第二个珠子在图片中已经被作记号. 图片 A 中的项链可以用下面的字符串表示: brbrrrbbbrrrrrbrrbbrbbbbrrrrb . 假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事.(颜色可能与在这之前收集的不同) 确定应该在哪里打破项链来收集到最大多数的数目的子. Example 举例来说,在图片 A 中的项链,可以收集到8个珠子,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链. 在一些项链中,包括白色的珠子如图片 B 所示. 当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色. 表现项链的字符串将会包括三符号 r , b 和 w . 写一个程序来确定从一条被供应的项链最大可以被收集珠子数目.
题解
模拟
代码
/*
ID: yjy_aii1
TASK: beads
LANG: C++
*/
#include <cstdio>
using namespace std;
int n,ans;
int a[400];
void read(){
char c;
int len=0;
c=getchar();
while (c<'a'||c>'z') c=getchar();
while (c>='a'&&c<='z') {
len++;
if (c=='r') a[len]=1;
if (c=='b') a[len]=2;
c=getchar();
}
a[0]=a[n];
}
int main(){
freopen("beads.in","r",stdin);
freopen("beads.out","w",stdout);
scanf("%d",&n);
read();
for (int i=1;i<=n;i++)
if (a[i]!=a[i-1]){
int l=0,r=0,le=i-1,ri=i,n1,n2;
if (le<=0) le+=n;if (ri>n) ri-=n;
while (a[le]==0) {le--;l++;if (le<=0) le+=n;}
while (a[ri]==0) {ri++;r++;if (ri>n) ri-=n;}
n1=a[le];n2=a[ri];
while (((a[ri]==n2)||(a[ri]==0))&&(ri!=le)){
r++;ri++;
if (ri>n) ri-=n;
}
ri--;if (ri<=0) ri+=n;
if (ri==le)r--;
while (((a[le]==n1)||(a[le]==0))&&(le!=ri)){
l++;le--;
if (le<=0) le+=n;
}
le++;if (le>n) le-=n;
if (ri==le) l--;
if (l+r>ans) ans=l+r;
}
if (ans==0) ans=n;
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
}