贪心,A和B先是一般的字符进行匹配,然后是A的’?‘和B的普通字符匹配,再然后是B的‘?’和A的普通字符匹配,最后A的‘?’和B的’?'进行匹配。
其实不难,考虑清楚就好了
#include<bits/stdc++.h>
using namespace std;
#define forn(i,n) for(int i = 0;i<int(n);i++)
typedef long long LL;
typedef pair<int,int> PII;
queue<int> Q[30];
vector<PII> ans;
vector<int> a1;
vector<int> a2;
int n,vis1[150010],vis2[150010];
char s1[150010],s2[150010];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
cin>>n;
cin>>s1>>s2;
for(int i = 0;i<n;i++){
if(s1[i] == '?') a1.push_back(i+1);
else Q[s1[i]-'a'].push(i+1);
}
for(int i = 0;i<n;i++){
if(s2[i] == '?'){
a2.push_back(i+1);
continue;
}
int num = s2[i] - 'a';
if(Q[num].size()) {
int t = Q[num].front();Q[num].pop();
ans.push_back({t,i+1});
vis1[t-1] = vis2[i] = 1;
}
}
if(a1.size()){
for(int i = 0;i<n &&a1.size();i++){
if(!vis2[i] && s2[i] != '?') {
ans.push_back({a1.back(),i+1});
vis1[a1.back()-1] = vis2[i] = 1;
a1.pop_back();
}
}
}
if(a2.size()){
for(int i = 0;i<n &&a2.size();i++){
if(!vis1[i] && s1[i] != '?') {
ans.push_back({i+1,a2.back()});
vis1[i] = vis2[a2.back()-1] = 1;
a2.pop_back();
}
}
}
for(int i = 0;i<min(a1.size(),a2.size());i++)
ans.push_back({a1[i],a2[i]});
cout<<ans.size()<<endl;
for(auto u : ans){
cout<<u.first<<' '<<u.second<<endl;
vis1[u.first] = vis2[u.second] = 1;
}
return 0;
}