你有一条由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 代表 白色的珠子
第一和第二个珠子在图片中已经被作记号。
这道题目其实就是一道模拟的题目,用最最简单的办法就是把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.