#include <bits/stdc++.h>
using namespace std;
struct node {
  int cnt;
  vector<int> v;
} u[27], v[27];
set<pair<int, int>> s;
int main() {
  int n;
  string a, b;
  cin >> n >> a >> b;
  for (int i = 0; i < n; i++) {
    if (a[i] == '?') {
      u[26].cnt++;
      u[26].v.push_back(i + 1);
    } else {
      u[a[i] - 'a'].cnt++;
      u[a[i] - 'a'].v.push_back(i + 1);
    }
  }
  for (int i = 0; i < n; i++) {
    if (b[i] == '?') {
      v[26].cnt++;
      v[26].v.push_back(i + 1);
    } else {
      v[b[i] - 'a'].cnt++;
      v[b[i] - 'a'].v.push_back(i + 1);
    }
  }
  int cnt = 0;
  for (char i = 'a'; i <= 'z'; i++) {
    int num1 = u[i - 'a'].cnt, num2 = v[i - 'a'].cnt;
    if (num1 != 0) {
      if (num2 != 0) {
        int MIN = min(num1, num2);
        u[i - 'a'].cnt -= MIN;
        v[i - 'a'].cnt -= MIN;
        while (MIN--) {
          cnt++;
          s.insert({u[i - 'a'].v.back(), v[i - 'a'].v.back()});
          u[i - 'a'].v.pop_back(), v[i - 'a'].v.pop_back();
        }
      }
    }
  }
  for (char i = 'a'; i <= 'z'; i++) {
    if (u[26].cnt != 0) {
      if (v[i - 'a'].cnt != 0) {
        int MIN = min(u[26].cnt, v[i - 'a'].cnt);
        u[26].cnt -= MIN;
        v[i - 'a'].cnt -= MIN;
        while (MIN--) {
          cnt++;
          s.insert({u[26].v.back(), v[i - 'a'].v.back()});
          u[26].v.pop_back(), v[i - 'a'].v.pop_back();
        }
      }
    }
    if (v[26].cnt != 0) {
      if (u[i - 'a'].cnt != 0) {
        int MIN = min(v[26].cnt, u[i - 'a'].cnt);
        v[26].cnt -= MIN;
        u[i - 'a'].cnt -= MIN;
        while (MIN--) {
          cnt++;
          s.insert({u[i - 'a'].v.back(), v[26].v.back()});
          u[i - 'a'].v.pop_back(), v[26].v.pop_back();
        }
      }
    }
  }
  int MIN = min(v[26].cnt, u[26].cnt);
  while (MIN--) {
    cnt++;
    s.insert({u[26].v.back(), v[26].v.back()});
    u[26].v.pop_back(), v[26].v.pop_back();
  }
  cout << cnt << endl;
  for (auto i = s.begin(); i != s.end(); i++)
    cout << i->first << " " << i->second << endl;
}
