破环成链, 复制一份到后面,那么可以对每一段进行枚举长度为n的区间。
用进制表示那种状态的珠子有无拿。$(11)_b = 3 $ 表示拿了红色和蓝色。
白色珠子直接拿。
#include <iostream>
using namespace std;
const int N = 710;
int n;
char s[N];
int get(int x)
{
if (s[x] == 'w') return 0;
if (s[x] == 'r') return 1;
return 2;
}
int main()
{
cin >> n >> s;
for (int i = 0; i < n; i ++) s[i + n] = s[i];
int res = 0;
for (int i = 0; i < n; i ++)
{
int l = i, r = i + n - 1, cnt = 0, left = 0, right = 0;
while (l <= r && (get(l) | left) != 3)
{
left |= get(l);
cnt ++, l ++;
}
while (r >= l && (get(r) | right) != 3)
{
right |= get(r);
cnt ++, r --;
}
res = max(res, cnt);
}
cout << res << endl;
return 0;
}