#include <bits/stdc++.h>
using namespace std;
vector<int> cr1[27];
vector<int> cr2[27];
int s1[27];
int s2[27];
struct node {
  int x;
  int y;
};
int main() {
  int n;
  cin >> n;
  char c;
  for (int i = 0; i < n; i++) {
    cin >> c;
    if (c == '?') {
      s1[26]++;
      cr1[26].push_back(i);
    } else {
      s1[c - 'a']++;
      cr1[c - 'a'].push_back(i);
    }
  }
  for (int i = 0; i < n; i++) {
    cin >> c;
    if (c == '?') {
      s2[26]++;
      cr2[26].push_back(i);
    } else {
      s2[c - 'a']++;
      cr2[c - 'a'].push_back(i);
    }
  }
  int cnt = 0;
  vector<node> nd;
  for (int i = 0; i < 26; i++) {
    int x = s1[i] - 1;
    int y = s2[i] - 1;
    while (x >= 0 && y >= 0) {
      node n1;
      n1.x = cr1[i][x];
      n1.y = cr2[i][y];
      nd.push_back(n1);
      cnt++;
      x--;
      y--;
    }
    if (x >= 0 && y < 0) {
      node n1;
      while (x >= 0 && s2[26] > 0) {
        n1.x = cr1[i][x];
        n1.y = cr2[26][s2[26] - 1];
        nd.push_back(n1);
        cnt++;
        s2[26]--;
        x--;
      }
    } else if (x < 0 && y >= 0) {
      node n1;
      while (y >= 0 && s1[26] > 0) {
        n1.x = cr1[26][s1[26] - 1];
        n1.y = cr2[i][y];
        nd.push_back(n1);
        cnt++;
        s1[26]--;
        y--;
      }
    }
  }
  while (s1[26] > 0 && s2[26] > 0) {
    node n1;
    n1.x = cr1[26][s1[26] - 1];
    n1.y = cr2[26][s2[26] - 1];
    nd.push_back(n1);
    cnt++;
    s1[26]--;
    s2[26]--;
  }
  cout << cnt << endl;
  for (int i = 0; i < nd.size(); i++)
    cout << nd[i].x + 1 << " " << nd[i].y + 1 << endl;
}
