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. |
English