#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;   }   