program haz; const nn=10000000000000000; var n: longword; m: longword; a: array[1..1000000] of longword; b: array[1..2000000] of boolean; c: array[1..1000000] of boolean; nww: Qword; k: longword; s: longint; min: longint; Wmin: longword; g,g0: Qword; p,p1: longword; n1,m1: Qword; b1: boolean; i,j: longword; z: char; qn,qj,qw: Qword; begin readln(n); for i:=1 to n do read(a[i]); readln(m); for i:=1 to m do begin read(z); if z = 'W' then begin b[i]:=true; b[i+m]:=true end end; n1:=n; m1:=m; nww:=n1*m1; while m1<>0 do begin p:=m1; m1:=n1 mod m1; n1:=p end; nww:=nww div n1; k:=nww div n; i:=0; g0:=nn; repeat i:=i+1; s:=0; min:=0; for j:=0 to k-1 do begin qn:=n; qj:=j; qw:=(qn*qj+i-1) mod m; b1:=b[qj+1]; c[j+1]:=b1; if b1 then s:=s+1 else begin s:=s-1; if s<min then begin min:=s; Wmin:=j+1 end; end; end; p:=a[i]; if p<=abs(min) then begin j:=0; repeat j:=j+1; if c[j] then p:=p+1 else p:=p-1 until (j=Wmin) or (p=0); if p=0 then begin g:=(j-1)*n + i; if g<g0 then g0:=g end; end else if s<0 then begin p1:=p-abs(min); s:=abs(s); n1:=p1 div s; p:=p-n1*s; j:=0; repeat j:=j+1; if c[j] then p:=p+1 else p:=p-1 until p=0; g:=(j-1+n1*k)*n + i; if g<g0 then g0:=g; end until (i=n) or (g0<=i); if g0<nn then writeln(g0) else writeln('-1'); end.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | program haz; const nn=10000000000000000; var n: longword; m: longword; a: array[1..1000000] of longword; b: array[1..2000000] of boolean; c: array[1..1000000] of boolean; nww: Qword; k: longword; s: longint; min: longint; Wmin: longword; g,g0: Qword; p,p1: longword; n1,m1: Qword; b1: boolean; i,j: longword; z: char; qn,qj,qw: Qword; begin readln(n); for i:=1 to n do read(a[i]); readln(m); for i:=1 to m do begin read(z); if z = 'W' then begin b[i]:=true; b[i+m]:=true end end; n1:=n; m1:=m; nww:=n1*m1; while m1<>0 do begin p:=m1; m1:=n1 mod m1; n1:=p end; nww:=nww div n1; k:=nww div n; i:=0; g0:=nn; repeat i:=i+1; s:=0; min:=0; for j:=0 to k-1 do begin qn:=n; qj:=j; qw:=(qn*qj+i-1) mod m; b1:=b[qj+1]; c[j+1]:=b1; if b1 then s:=s+1 else begin s:=s-1; if s<min then begin min:=s; Wmin:=j+1 end; end; end; p:=a[i]; if p<=abs(min) then begin j:=0; repeat j:=j+1; if c[j] then p:=p+1 else p:=p-1 until (j=Wmin) or (p=0); if p=0 then begin g:=(j-1)*n + i; if g<g0 then g0:=g end; end else if s<0 then begin p1:=p-abs(min); s:=abs(s); n1:=p1 div s; p:=p-n1*s; j:=0; repeat j:=j+1; if c[j] then p:=p+1 else p:=p-1 until p=0; g:=(j-1+n1*k)*n + i; if g<g0 then g0:=g; end until (i=n) or (g0<=i); if g0<nn then writeln(g0) else writeln('-1'); end. |