题目: 传送门
思路: 先统计每个字符串每个字符的数量,然后针对每个不为"?“的字符,先让两个字符串的该字符相配对,如果不够,便使用”?",最后将两边剩余的"?“配对即可,难度感觉不大,就是操作繁琐,细节处理.
int n;
queue<pair<int,int> > q_ed;
queue<int> q1[27];
queue<int> q2;
string s1,s2;
int main() {
cin>>n>>s1>>s2;
pair<int,int> p;
for(int i=0;i<n;i++) {
if(s1[i]=='?') q1[26].push(i);
else {
int k =s1[i]-'a';
q1[k].push(i);
}
}
for(int i = 0;i<n;i++) {
if(s2[i]=='?') q2.push(i);
else {
int k =s2[i]-'a';
if(!q1[k].empty()) {
p.first = q1[k].front()+1;
p.second = i+1;
q1[k].pop();
q_ed.push(p);
}
else {
if(!q1[26].empty()) {
p.first = q1[26].front()+1;
p.second = i+1;
q1[26].pop();
q_ed.push(p);
}
}
}
}
for(int i=0;i<27;i++) {
int flag = 1;
while(!q1[i].empty()) {
if(!q2.empty()) {
p.first = q1[i].front()+1;
p.second = q2.front()+1;
q_ed.push(p);
q1[i].pop();
q2.pop();
}
else {
flag =0;
break;
}
}
if(!flag) break;
}
cout<<q_ed.size()<<endl;
while(!q_ed.empty()) {
cout<<q_ed.front().first<<' '<<q_ed.front().second<<endl;
q_ed.pop();
}
return 0;
}