#UT114. [USACO1.1.4] 破碎的项链 Broken Necklace

[USACO1.1.4] 破碎的项链 Broken Necklace

破碎的项链

你有一条由 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 中的配置可以用一串 b 和 r 来表示,其中 b 表示蓝色珠子,r 表示红色珠子,如下所示:brbrrrbbbrrrrrbrrbbrbbbbrrrrb

假设你要在某个点断开项链,将其平放,然后从一端开始收集相同颜色的珠子,直到遇到不同颜色的珠子,然后在另一端做同样的操作(该端的颜色可能与之前收集的颜色不同)。

确定在哪一点断开项链,以便收集到最多的珠子。

示例

例如,对于图 A 的项链,可以收集到 8 个珠子,断开点可以在第 9 和第 10 个珠子之间,或者在第 24 和第 25 个珠子之间。

在某些项链中,如图 B 所示,包含了白色珠子。当收集珠子时,遇到的白色珠子可以视为红色或蓝色,然后用所需的颜色进行涂色。 表示该配置的字符串可以包含任何三种符号 r、b 和 w。

编写一个程序来确定从提供的项链中可以收集到的最多珠子的数量。

程序名称:beads

输入格式

  • 第1行:N,珠子的数量
  • 第2行:N个字符的字符串,每个字符为 r、b 或 w

示例输入(文件 beads.in)

29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

输出格式

一行输出一个单独的数字,表示可以从提供的项链中收集的最多珠子的数量。

示例输出(文件 beads.out)

11

输出解释

考虑将珠子的两个副本连接在一起(有点像可以绕过两端)。该字符串的 11 被标记。

                两条项链复本连接在这里
                             v
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb|wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
                       ******|*****
                       rrrrrb|bbbbb  <-- 分配
                   5xr .....#|#####  6xb

                        5+6 = 11 总数