#include <bits/stdc++.h>
const int inf = 0x3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3fLL;
const double dinf = inf;
using namespace std;
const int N = 150000 + 10;
const double eps = 1e-10;
const double PI = acos(-1.0);
const int dx[4] = {0, 1, 0, -1};
const int dy[4] = {1, 0, -1, 0};
int n;
char l[N], r[N];
int lc[30], rc[30];
int ll, rr;
stack<int> sl[30], sr[30], srr, sll;
vector<pair<int, int> > ans;
int cnt;
int idx(char x) { return x - 'a'; }
int main() {
  scanf("%d", &n);
  scanf("%s", l);
  scanf("%s", r);
  for (int i = 0; i < (n); i++) {
    if (l[i] == '?') {
      ll++;
      sll.push(i + 1);
    } else {
      lc[idx(l[i])]++;
      sl[idx(l[i])].push(i + 1);
    }
  }
  for (int i = 0; i < (n); i++) {
    if (r[i] == '?') {
      rr++;
      srr.push(i + 1);
    } else {
      rc[idx(r[i])]++;
      sr[idx(r[i])].push(i + 1);
    }
  }
  for (int i = 0; i < (26); i++) {
    int num = min(lc[i], rc[i]);
    cnt += num;
    lc[i] -= num;
    rc[i] -= num;
    while (num--) {
      ans.push_back(make_pair(sl[i].top(), sr[i].top()));
      sl[i].pop();
      sr[i].pop();
    }
  }
  int i = 0;
  while (ll > 0) {
    while (i < 26 && rc[i] <= 0) i++;
    if (i >= 26) break;
    int num = min(ll, rc[i]);
    cnt += num;
    ll -= num;
    rc[i] -= num;
    while (num--) {
      ans.push_back(make_pair(sll.top(), sr[i].top()));
      sll.pop();
      sr[i].pop();
    }
  }
  i = 0;
  while (rr > 0) {
    while (i < 26 && lc[i] <= 0) i++;
    if (i >= 26) break;
    int num = min(rr, lc[i]);
    cnt += num;
    rr -= num;
    lc[i] -= num;
    while (num--) {
      ans.push_back(make_pair(sl[i].top(), srr.top()));
      srr.pop();
      sl[i].pop();
    }
  }
  while (ll > 0 && rr > 0) {
    ll--, rr--;
    cnt++;
    ans.push_back(make_pair(sll.top(), srr.top()));
    srr.pop();
    sll.pop();
  }
  printf("%d\n", cnt);
  for (int i = 0; i < (ans.size()); i++) {
    printf("%d %d\n", ans[i].first, ans[i].second);
  }
  return 0;
}
