#include <bits/stdc++.h>
using namespace std;
using namespace std::chrono;
const int N = 1e6, M = N, inf = (int)1e9;
const long long mod = 1e9 + 7;
int fastAbs(int n) { return (n ^ (n >> 31)) - (n >> 31); }
long long multiply(long long a, long long b) {
  return ((a % mod) * (b % mod)) % mod;
}
long long add(long long a, long long b) {
  return ((a % mod) + (b % mod)) % mod;
}
long long sub(long long a, long long b) {
  return ((a % mod) - (b % mod) + mod) % mod;
}
int ans;
void read(vector<int>& a) {
  for (int i = 1; i < a.size(); i++) cin >> a[i];
}
map<pair<int, int>, int> mp;
const int dx[4] = {1, 0, 0, -1};
const int dy[4] = {0, -1, 1, 0};
void solve() {
  int n;
  cin >> n;
  string left, right;
  cin >> left >> right;
  map<int, queue<int> > mp, question_mark;
  for (int i = 0; i < n; i++) {
    mp[left[i]].push(i + 1);
  }
  vector<pair<int, int> > answer;
  vector<bool> visited1(n);
  for (int i = 0; i < n; i++) {
    if (mp.find(right[i]) != mp.end() && !mp[right[i]].empty() &&
        right[i] != '?') {
      answer.push_back({mp[right[i]].front(), i + 1});
      visited1[mp[right[i]].front() - 1] = true;
      mp[right[i]].pop();
    } else {
      if (mp.find('?') != mp.end() && !mp['?'].empty() && right[i] != '?') {
        answer.push_back({mp['?'].front(), i + 1});
        visited1[mp['?'].front() - 1] = true;
        mp['?'].pop();
      }
    }
  }
  for (int i = 0; i < n; i++) {
    if (visited1[i] != true) {
      mp['*'].push(i + 1);
    }
  }
  for (int i = 0; i < n; i++) {
    if (right[i] == '?' && mp.find('*') != mp.end() && !mp['*'].empty()) {
      answer.push_back({mp['*'].front(), i + 1});
      mp['*'].pop();
    }
  }
  cout << answer.size();
  cout << "\n";
  for (int i = 0; i < answer.size(); i++) {
    cout << answer[i].first << " " << answer[i].second << "\n";
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int q = 1;
  while (q--) solve();
}
