只能说这真的是一道好题目,考验耐心细心…
尼玛提交了六次!(有一次是因为忘记开文件了!)智商拙计了!
a数组用于存储项链的颜色,ans用于存储当前最大解。
函数cut中:l、r分别表示左右搜索端点;x00表示左搜索用于比较的端点,x0表示右搜索用于比较的端点。
需要注意:
1. 可能一个圈都是一个颜色,预判避免死循环。
2. 向两边搜的时候,注意如果达成一个圈了搜索就停止,输出n。
3. 向左边搜,起始节点l,但是l可能是白色,因此不能单单和a[l]作比较。
4. 本程序在项链成环方面可以继续用mod优化。
Beads
var a:array[1..350] of integer; c:char; ans,n,i,t:integer; flag:boolean; function cut(x:integer):integer; var l,r,x00,x0,answer:integer; begin l:=x;r:=x+1; x0:=x+1; x00:=x; if r>n then begin r:=1; x0:=1; end; while a[x00]=3 do begin dec(x00); if x00<1 then x00:=n; end; while a[x0]=3 do begin inc(x0); if x0>n then x0:=1; end; while (a[l]=a[x]) or (a[l]=3) do begin dec(l); if l<1 then l:=n; end; while (a[r]=a[x0]) or (a[r]=3) do begin inc(r); if r>n then r:=1; if r=l then exit(n); end; answer:=r-l-1; if answer<0 then answer:=answer+n; cut:=answer; end; begin assign(input,'beads.in');reset(input); assign(output,'beads.out');rewrite(output); readln(n); for i:=1 to n do begin read(c); case c of 'r':a[i]:=1; 'b':a[i]:=2; 'w':a[i]:=3; end; end; flag:=false; for i:=1 to n-1 do if (a[i]<>a[i+1]) and (a[i]<>3) then begin flag:=true; break; end; if (a[1]<>a[n]) and (a[n]<>3) then flag:=true; if not flag then begin writeln(n); close(input); close(output); halt; end; for i:=1 to n do if a[i]<>a[i+1] then begin t:=cut(i); if t>ans then ans:=t; end; writeln(ans); close(input);close(output); end.