【USACO题库】1.1.4 Broken Necklace破碎的项链

题目描述:

你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3<=N<=35000),珠子是随意安排的。 这里是 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 .

假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事。(颜色可能与在这之前收集的不同) 确定应该在哪里打破项链来收集到最大多数的数目的子。 Example 举例来说,在图片 A 中的项链,可以收集到8个珠子,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链。 在一些项链中,包括白色的珠子如图片 B 所示。 当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。 表现项链的字符串将会包括三符号 r , b 和 w 。 写一个程序来确定从一条被供应的项链最大可以被收集珠子数目。

输入
第 1 行:N, 珠子的数目
第 2 行:一串度为N的字符串, 每个字符是 r , b 或 w。

输出
单独的一行包含从被供应的项链可以被收集的珠子数目的最大值。


样例输入
29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

样例输出
11


这道题目其实就是一道模拟的题目,用最最简单的办法就是把s串变为s+s+s,这样子方便首尾连应,然后判断一下当前s[i]和s[j]是否相等,或者s[j]='w'的时候则可以继续下去,这里有个地方需要注意的是:一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。这里强调了是被遇到,也就是说当前面全是w,而现在忽然出现了一个'b','r'都是不行的。也可以说成当当前第i个字符是'w'的时候无需模拟下去(除针对数据——如全是'w')。


代码:

var
        n,i,j,ans,max:Longint;
        s:ansistring;
begin
        readln(n);
        readln(s);

        s:=s+s+s;

        for i:=n+1 to 2*n do
        begin
                j:=i-1;
                while ((s[j]='w') or  (s[j]=s[i]))  and (j>0) do dec(j);
                ans:=i-j;
                j:=i+1;
                while ((s[j]='w') or (s[j]=s[i+1])) and (j<3*n) do inc(j);

                if ans+j-i-1>max then max:=ans+j-i-1;
                if ans>n then break;
        end;
        if max>n then writeln(n) else writeln(max);
end.

你可能感兴趣的:(【USACO题库】1.1.4 Broken Necklace破碎的项链)