####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;
}