import std.algorithm, std.conv, std.range, std.stdio, std.string;

void readV(T...)(ref T t){auto r=readln.splitter;foreach(ref v;t){v=r.front.to!(typeof(v));r.popFront;}}
void readA(T)(size_t n,ref T t){t=new T(n);auto r=readln.splitter;foreach(ref v;t){v=r.front.to!(ElementType!T);r.popFront;}}
void readM(T...)(size_t n,ref T t){foreach(ref v;t)v=new typeof(v)(n);foreach(i;0..n){auto r=readln.splitter;foreach(ref v;t){v[i]=r.front.to!(ElementType!(typeof(v)));r.popFront;}}}
void readS(T)(size_t n,ref T t){t=new T(n);foreach(ref v;t){auto r=readln.splitter;foreach(ref j;v.tupleof){j=r.front.to!(typeof(j));r.popFront;}}}

void main()
{
  int n, k; readV(n, k);
  int[] x, y; string[] s; readM(n, x, y, s);

  foreach (i; 0..n) if (s[i] == "W") x[i] += k;
  auto k2 = k*2;
  x[] %= k2; y[] %= k2;

  auto c = new int[][](k2*2, k2*2);
  foreach (xi, yi; lockstep(x, y)) {
    auto xs1 = max(0, xi-k+1), ys1 = max(0, yi-k+1);
    c[ys1][xs1]++;
    c[ys1][xi+1]--;
    c[yi+1][xs1]--;
    c[yi+1][xi+1]++;
    c[yi+1][xi+1]++;
    c[yi+1+k][xi+1]--;
    c[yi+1][xi+1+k]--;
    c[yi+1+k][xi+1+k]++;
  }

  foreach (i; 0..k2)
    foreach (j; 1..k2)
      c[i][j] += c[i][j-1];
  foreach (j; 0..k2)
    foreach (i; 1..k2)
      c[i][j] += c[i-1][j];

  auto r = 0;
  foreach (i; 0..k2)
    foreach (j; 0..k2)
      r = max(r, c[i][j]);

  writeln(r);
}
