####Broken Necklace####
简述:
红白蓝三种珠子,白色可以替代另外两种颜色,在一串珠子中找出红蓝两段相连珠子数最大是多少。最麻烦的就在首尾两端的是断开的,统计起来不是很方便。。。
然后,我就把它复制一遍,贴在后面,就连起来了。不过这时就要注意,它如果整个串都是符合条件的那种情况的话,就需要判断不能统计两遍了。
代码:
#include <stdio.h>
#include <string.h>
char bead[800];
int n;
int fx(int b1, int b2);
int main(void)
{
freopen("beads.in", "r", stdin);
freopen("beads.out", "w", stdout);
int i, max = 0, b1, b2, flag = 0, x;
scanf("%d\n", &n);
scanf("%s",bead);
if(!strchr(bead,'r') || !strchr(bead,'b'))
{
printf("%d\n",n);
return 0;
}
for(i = 0; i < n; i++)
bead[i+n] = bead[i];
n += n;
flag = 0;
for(i = 0; i < n; i++)
{
if(bead[i] == 'w')continue;
if(flag == 0)
{
b1 = i;
flag = 1;
}
if(flag == 1 && bead[i] != bead[b1])
{
b2 = i;
flag = 2;
}
if(flag == 2)
{
i--;
flag = 0;
x = fx(b1, b2);
if(x > max)max = x;
}
}
n /= 2;
printf("%d\n", max > n?n:max);
return 0;
}
int fx(int b1, int b2)
{
int l,r;
if(b1 > 0)
l = b1 - 1;
else
l = 0;
if(b2 < n-1)
r = b2 + 1;
else
r = n-1;
while(l && (bead[l] == bead[b1] || bead[l] == 'w'))l--;
while(r < n-1 && (bead[r] == bead[b2] || bead[r] == 'w'))r++;
if(!(bead[l] == bead[b1] || bead[l] == 'w'))l++;
if(!(bead[r] == bead[b2] || bead[r] == 'w'))r--;
return r - l + 1;
}