这道题中项链是环形的,我们可以把两条项链放在一起就可以省去数据处理取摸运算。我们可以设置两个关键变量sum_cur(记录断开处后边满足条件的序列) sum_pur(记录断开处前边满足条件的序列),题目一共有三种颜色的珠子。遇到白色珠子时白色珠子数目加一(sum_w++),sum_cur++。遇到的不是白色珠子,而且和前边那个珠子的颜色不同,就看看能收集到的珠子数目是否会有变化,更新sum_pur,sum_w,sum_cur。遇到的不是白色珠子但是和前一个珠子颜色相同,就更新一下sum_cur。
/*
ID: acmerfi1
PROG: beads
LANG: C++
*/
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX 1000
using namespace std;
int N, sum_w = 0, sum_cur = 0, sum_pur = 0, max_sum = 0;
char str[MAX], ch, nowc = '0';
int main()
{
freopen("beads.in", "r", stdin);
freopen("beads.out", "w", stdout);
scanf("%d", &N);
getchar();
memset(str, 0, sizeof(str));
for(int i = 0; i < N; i++)
{
scanf("%c", &str[i]);
}
memcpy(str+N, str, N);
for(int i = 0; str[i] && max_sum < N; i++)
{
if('w' == str[i]) sum_w++, sum_cur++;
else if(nowc != str[i])
{
if(max_sum < sum_cur + sum_pur) max_sum = sum_pur + sum_cur;
sum_pur = sum_cur - sum_w;
sum_cur = sum_w + 1;
sum_w = 0, nowc = str[i];
}
else sum_cur++, sum_w = 0;
}
if(max_sum < sum_cur + sum_pur) max_sum = sum_pur + sum_cur;
printf("%d\n", max_sum > N ? N : max_sum);
return 0;
}