Codeforces1141D

贪心,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; 
} 

猜你喜欢

转载自blog.csdn.net/winhcc/article/details/88831612