{$Q-,R-,I-} program macro; const MaxS=17; MaxN=1 shl MaxS; type float = double; complex = record x, y : float end; arr = array [0..MaxN-1] of complex; parr = ^arr; str = array [0..MaxN-1] of byte; var Si : array [0..MaxN*3 shr 2] of float; rev : array [0..MaxN-1] of integer; A, B, C, T : parr; s, N, Q, H : integer; zx, zy : str; procedure mktab; var i : integer; a, b : extended; begin rev[0] := 0; Q := 1; while Q < N do begin for i := 0 to Q - 1 do begin rev[i] := rev[i] shl 1; rev[i+Q] := rev[i] + 1 end; Q := Q shl 1 end; a := 2*Pi/N; Q := N shr 2; H := N shr 1; for i := 0 to N shr 3 do begin b := a * i; Si[Q-i] := cos (b); Si[i] := sin(b); end; for i := 1 to Q do Si[Q+i] := Si[Q-i]; for i := 0 to Q do Si[H+i] := -Si[i]; end; procedure step (k : integer; const A : arr; var B : arr); var m, c, d, i : integer; t, u, v, r : complex; begin m := N shr k; r.x := 1; r.y := 0; c := m; d := 0; for i := 0 to H - 1 do begin t := A[2*i]; u := A[2*i+1]; v.x := u.x * r.x - u.y * r.y; v.y := u.x * r.y + u.y * r.x; B[i].x := t.x + v.x; B[i].y := t.y + v.y; B[i+H].x := t.x - v.x; B[i+H].y := t.y - v.y; dec (c); if c = 0 then begin c := m; inc (d, m); r.y := Si[d]; r.x := Si[d+Q]; end end end; procedure fourier (var A : parr); var i : integer; C : parr; begin for i := 1 to s do begin step (i, A^, T^); C := A; A := T; T := C end end; procedure bbixob (var s : complex; const u, v : complex); var z, w : complex; begin z.x := u.x + v.x; { z = u+conj(v); w = -i*(u-conj(v)) } z.y := u.y - v.y; w.x := u.y + v.y; w.y := v.x - u.x; s.x := s.x + z.x*w.x + z.y*w.y; s.y := s.y + z.x*w.y - z.y*w.x; end; var i, k, max, cur, mp : integer; ch : char; zt : complex; it : float; begin reset (input, 'robots.in'); rewrite (output, 'robots.out'); readln (N); assert ((N >= 4) and (N <= MaxN) and ((N and pred(N))=0)); s := 0; while (1 shl s) < N do inc (s); for i:=0 to N-1 do begin read (ch); zx[i]:=pos (ch, 'ACGT'); assert (zx[i] > 0) end; readln; for i:=0 to N-1 do begin read (ch); zy[i]:=pos (ch, 'ACGT'); assert (zy[i] > 0) end; readln; mktab; new (T); new (A); new (B); new (C); for i := 0 to N - 1 do with C^[i] do begin x := 0; y := 0 end; B^ := C^; B^[0].x := N; B^[0].y := N; for k := 1 to 4 do begin if k < 4 then begin for i := 0 to N - 1 do with A^[rev[i]] do begin x := ord(zx[i] = k); y := ord(zy[i] = k) end; fourier (A); for i := 0 to N - 1 do with B^[i] do begin x := x - A^[i].x; y := y - A^[i].y end end else A := B; bbixob (C^[0], A^[0], A^[0]); for i := 1 to N - 1 do bbixob (C^[i], A^[i], A^[N-i]); end; for i := 0 to N - 1 do if i < rev[i] then begin zt := C^[rev[i]]; C^[rev[i]] := C^[i]; C^[i] := zt end; fourier (C); max := -1; mp := -1; it := 1/(4*N); for i := 0 to N - 1 do begin cur := round (C^[i].x * it); assert ((cur >= 0) and (cur <= N) and (abs (C^[i].y * it) < 1e-2)); if cur > max then begin max := cur; mp := i end end; writeln (max, ' ', mp) end.