#4721. [USACO 1.2.4] Broken Necklace

[USACO 1.2.4] Broken Necklace

Broken Necklace

你有一条由 NN 个红色、白色或蓝色珠子组成的项链(3N3503≤N≤350),其中一些是红色的,一些是蓝色的,还有一些是白色的,它们的排列是随机的。以下是 n=29n=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 中的项链,可以在第 9 个珠子和第 10 个珠子之间或第 24 个珠子和第 25 个珠子之间折断,从而收集到 8 个珠子。

在一些项链中,还加入了白色珠子,如上图 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 总数