【题面】
【题解】
题意:给定相同数量的左右靴子的颜色序列,要求输出最多可配对的左右靴子总数和配对情况。
思路:相同颜色可配,未知颜色与任意颜色可配,未知颜色与未知颜色可配。为使答案最优,优先处理右靴子可与左靴子配对的相同颜色,不可配对的与左靴子的未知颜色配对,最后配对右靴子的未知颜色与未配对的左靴子。最后输出答案即可。
【代码】
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n; scanf("%d",&n);
vector <int> vec[30];
string s; cin>>s;
for(int i=0;i<n;i++){
if(s[i]=='?') vec[26].push_back(i+1);
else vec[s[i]-'a'].push_back(i+1);
}
cin>>s; queue <int> q1,q2;
for(int i=0;i<n;i++){
int t=s[i]-'a';
if(s[i]=='?') q1.push(i+1);
else if(!vec[t].empty()){
q2.push(vec[t][vec[t].size()-1]);
q2.push(i+1);
vec[t].pop_back();
}
else if(!vec[26].empty()){
q2.push(vec[26][vec[26].size()-1]);
q2.push(i+1);
vec[26].pop_back();
}
}
int cnt=0;
while(!q1.empty()){
while(vec[cnt].empty()&&cnt<27) cnt++;
q2.push(vec[cnt][vec[cnt].size()-1]);
q2.push(q1.front());
vec[cnt].pop_back();
q1.pop();
}
int l=q2.size();
printf("%d\n",l/2);
while(!q2.empty()){
printf("%d ",q2.front());
q2.pop();
printf("%d",q2.front());
q2.pop();
}
return 0;
}