#include <bits/stdc++.h>
using namespace std;
const double pi = acos(0.0) * 2.0;
const double eps = 1e-12;
const int step[8][2] = {{1, 0}, {-1, 0}, {0, 1},  {0, -1},
                        {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
template <class T>
inline T abs1(T a) {
  return a < 0 ? -a : a;
}
template <class T>
inline T max1(T a, T b) {
  return a > b ? a : b;
}
template <class T>
inline T max1(T a, T b, T c) {
  return max1(max1(a, b), c);
}
template <class T>
inline T max1(T a, T b, T c, T d) {
  return max1(max1(a, b, c), d);
}
template <class T>
inline T max1(T a, T b, T c, T d, T e) {
  return max1(max1(a, b, c, d), e);
}
template <class T>
inline T min1(T a, T b) {
  return a < b ? a : b;
}
template <class T>
inline T min1(T a, T b, T c) {
  return min1(min1(a, b), c);
}
template <class T>
inline T min1(T a, T b, T c, T d) {
  return min1(min1(a, b, c), d);
}
template <class T>
inline T min1(T a, T b, T c, T d, T e) {
  return min1(min1(a, b, c, d), e);
}
inline int jud(double a, double b) {
  if (abs(a) < eps && abs(b) < eps)
    return 0;
  else if (abs1(a - b) / abs1(a) < eps)
    return 0;
  if (a < b) return -1;
  return 1;
}
template <typename t>
inline int jud(t a, t b) {
  if (a < b) return -1;
  if (a == b) return 0;
  return 1;
}
template <typename it, typename t1>
inline int find(t1 val, it a, int na, bool f_small = 1, bool f_lb = 1) {
  int be = 0, en = na - 1;
  if (*a <= *(a + na - 1)) {
    if (f_lb == 0)
      while (be < en) {
        int mid = (be + en + 1) / 2;
        if (jud(*(a + mid), val) != 1)
          be = mid;
        else
          en = mid - 1;
      }
    else
      while (be < en) {
        int mid = (be + en) / 2;
        if (jud(*(a + mid), val) != -1)
          en = mid;
        else
          be = mid + 1;
      }
    if (f_small && jud(*(a + be), val) == 1) be--;
    if (!f_small && jud(*(a + be), val) == -1) be++;
  } else {
    if (f_lb)
      while (be < en) {
        int mid = (be + en + 1) / 2;
        if (jud(*(a + mid), val) != -1)
          be = mid;
        else
          en = mid - 1;
      }
    else
      while (be < en) {
        int mid = (be + en) / 2;
        if (jud(*(a + mid), val) != 1)
          en = mid;
        else
          be = mid + 1;
      }
    if (!f_small && jud(*(a + be), val) == -1) be--;
    if (f_small && jud(*(a + be), val) == 1) be++;
  }
  return be;
}
template <class T>
inline T lowb(T num) {
  return num & (-num);
}
inline int bitnum(unsigned int nValue) { return __builtin_popcount(nValue); }
inline int bitnum(int nValue) { return __builtin_popcount(nValue); }
inline int bitnum(unsigned long long nValue) {
  return __builtin_popcount(nValue) + __builtin_popcount(nValue >> 32);
}
inline int bitnum(long long nValue) {
  return __builtin_popcount(nValue) + __builtin_popcount(nValue >> 32);
}
inline int bitmaxl(unsigned int a) {
  if (a == 0) return 0;
  return 32 - __builtin_clz(a);
}
inline int bitmaxl(int a) {
  if (a == 0) return 0;
  return 32 - __builtin_clz(a);
}
inline int bitmaxl(unsigned long long a) {
  int temp = a >> 32;
  if (temp) return 32 - __builtin_clz(temp) + 32;
  return bitmaxl(int(a));
}
inline int bitmaxl(long long a) {
  int temp = a >> 32;
  if (temp) return 32 - __builtin_clz(temp) + 32;
  return bitmaxl(int(a));
}
long long pow(long long n, long long m, long long mod = 0) {
  if (m < 0) return 0;
  long long ans = 1;
  long long k = n;
  while (m) {
    if (m & 1) {
      ans *= k;
      if (mod) ans %= mod;
    }
    k *= k;
    if (mod) k %= mod;
    m >>= 1;
  }
  return ans;
}
const int maxn = 200100;
int sumc[maxn];
int stat[maxn], nxt[maxn];
int cntnot[maxn];
int sum[2][maxn];
char mp[2][maxn];
int l, nq;
int main() {
  ios_base::sync_with_stdio(0);
  scanf("%d%d", &l, &nq);
  scanf("%s%s", mp[0], mp[1]);
  stat[0] = 0;
  if (mp[0][0] == 'X') stat[0] = 1;
  sum[0][0] = mp[0][0] == 'X';
  sum[1][0] = mp[1][0] == 'X';
  for (int i = 1; i < l; i++) {
    stat[i] = stat[i - 1];
    sumc[i] = sumc[i - 1];
    cntnot[i] = cntnot[i - 1];
    if (mp[stat[i]][i] == 'X') {
      stat[i] = 1 - stat[i];
      sumc[i]++;
    }
    if (mp[1][i] == mp[0][i] && mp[0][i] == 'X')
      cntnot[i]++;
    else if (mp[1][i] == mp[0][i - 1] && mp[1][i] == 'X')
      cntnot[i]++;
    else if (mp[0][i] == mp[1][i - 1] && mp[0][i] == 'X')
      cntnot[i]++;
    sum[0][i] = sum[0][i - 1] + (mp[0][i] == 'X');
    sum[1][i] = sum[1][i - 1] + (mp[1][i] == 'X');
  }
  nxt[l - 2] = l - 1;
  for (int i = l - 2; i >= 0; i--) {
    if (stat[i] != stat[i + 1])
      nxt[i] = nxt[i + 1] = i + 1;
    else
      nxt[i] = nxt[i + 1];
  }
  for (int i = 0; i < nq; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    a--, b--;
    pair<int, int> be = make_pair(a / l, a % l), en = make_pair(b / l, b % l);
    if (be.second > en.second) swap(en, be);
    if (cntnot[en.second] != cntnot[be.second])
      puts("-1");
    else if (be.first == en.first &&
             sum[be.first][en.second] - sum[be.first][be.second] == 0)
      printf("%d\n", en.second - be.second);
    else if (sumc[be.second] == sumc[en.second]) {
      if (be.first != en.first)
        printf("%d\n", 1 + en.second - be.second);
      else
        printf("%d\n", 2 + en.second - be.second);
    } else {
      int minus = 0;
      if (be.first != stat[be.second])
        if (sum[be.first][nxt[be.second]] == sum[be.first][be.second])
          minus += 2;
      printf("%d\n", (stat[be.second] != be.first) +
                         (stat[en.second] != en.first) + sumc[en.second] -
                         sumc[be.second] + en.second - be.second - minus);
    }
  }
  return 0;
}
