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.