1. 程式人生 > >Broken Necklace ( USACO1.1.4 破碎的項鍊)

Broken Necklace ( USACO1.1.4 破碎的項鍊)

Description

你有一條由N個紅色的,白色的,或藍色的珠子組成的項鍊(3<=N<=350),珠子是隨意安排的。 這裡是 n=29 的二個 例子:

               1 2                               1 2
           r b b r                           b r r b
         r         b                       b         b
        r           r                     b           r
       r             r                   w             r
      b               r                 w               w
     b                 b               r                 r
     b                 b               b                 b
     b                 b               r                 b
      r               r                 b               r
       b             r                   r             r
        b           r                     r           r
          r       r                         r       b
            r b r                             r r w
            圖片 A                        圖片  B
                
                            r 代表 紅色的珠子      
                            b 代表 藍色的珠子   
                            w 代表 白色的珠子

第一和第二個珠子在圖片中已經被作記號。 圖片 A 中的項鍊可以用下面的字串表示: brbrrrbbbrrrrrbrrbbrbbbbrrrrb . 假如你要在一些點打破項鍊,展開成一條直線,然後從一端開始收集同顏色的珠子直到你遇到一個不同的顏色珠子,在 另一端做同樣的事(顏色可能與在這之前收集的不同)。 確定應該在哪裡打破項鍊來收集到最大多數的數目的珠子。 例如,在圖片 A 中的項鍊中,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之間打斷項鍊可以收集到8個珠子。 在一些項 鏈中還包括白色的珠子(如圖片B) 所示。 當收集珠子的時候,一個被遇到的白色珠子可以被當做紅色也可以被當做藍色。 表現含有白珠項鍊的字串將會包括三個符號 r , b 和 w 。 寫一個程式來確定從一條被給出的項鍊可以收集到的最大珠子數目。

Input

第 1 行: N, 珠子的數目 第 2 行: 一串長度為N的字串, 每個字元是 r , b 或 w。

Output

單獨的一行包含從被供應的項鍊可以被收集的珠子數目的最大值。

Sample Input

29 
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

Sample Output

11 

題意:

假如 你要在一些點打破項鍊,展開成一條直線,然後從一端開始收集同顏色的珠子直到你遇到一個不同的顏色珠子,在 
另一端做同樣的事(顏色可能與在這之前收集的不同)。

確定應該在哪裡打破項鍊來收集到最大的數目 
例如,

在圖片 A 中的項鍊,可以收集到8個珠子,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之間打斷項鍊。 在一些項 
鏈中,包括白色的珠子如圖片 B 所示。 當收集珠子的時候,一個被遇到的白色珠子可以被當做紅色也可以被當做藍色。

思路:

      需要注意的是,從斷點處,向左找,找到字串的開始位置時,要去字串的末尾往前找

      向右找時,找到字串的末尾位置時,要去字串的開始位置找,因為 項鍊是一個環

      解決以上問題的方法:  在字串的末尾連線一個 一模一樣的字串

從某一點,往左找往右找,比較和最大

CODE:

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
#define memset(a,n) memset(a,n,sizeof(a))
 
char a[1500+10];
int main()
{
    int n;
    int flag=0;
 
    scanf("%d",&n);
    getchar();
 
    for(int i=1;i<=n;i++)
    {
        scanf("%c",&a[i]);
        a[n+i]=a[i];
    }
    char pos;
    int ans=0;
    int cnt=0;
 
    for(int i=2; i<=2*n;i++)
    {
        cnt=0;
        int l=i-1;
        int r=i;
 
        pos=a[l];
 
        while(a[l]=='w'&&l>0)
            cnt++,l--;
 
        if(a[l]!='w')
            pos=a[l];
 
        while((a[l]=='w'||a[l]==pos)&&l>0)
            cnt++,l--;
 
        pos=a[r];
 
        while(a[r]=='w'&&r<=2*n)
            cnt++,r++;
 
        if(a[r]!='w')
            pos=a[r];
 
        while((a[r]=='w'||a[r]==pos)&&r<=2*n)
            cnt++,r++;
 
        if(cnt>ans)
            ans=cnt;
    }
    if(ans>n)
        ans=n;
 
    printf("%d\n",ans);
 
}