USACO--beads

####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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章