CF--D. Colored Boots(字符串找匹配)

D. Colored Boots

思路:

找到所有小写字母,将它们所有的下标位置存入一个数组,然后每次查询相同的字母在s1,s2中的相同字母的位置,

然后输出就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<utility>
using namespace std;
const int maxn = 2e5+10;
char s1[maxn],s2[maxn];
vector <int> v1[30],v2[30];
vector <pair <int,int> > ans;
int main(void)
{
	int n,i,j,cnt = 0;
	scanf("%d",&n);
	scanf("%s%s",s1+1,s2+1);
	for(i=1;i<=n;i++){
		if(s1[i]>='a'&&s1[i]<='z') v1[s1[i]-'a'].push_back(i);
		else v1[26].push_back(i);
		if(s2[i]>='a'&&s2[i]<='z') v2[s2[i]-'a'].push_back(i);
		else v2[26].push_back(i);
	}
	for(i=0;i<=26;i++){
		while(v1[i].size()>0&&v2[i].size()>0){
			ans.push_back(make_pair(v1[i][v1[i].size()-1],v2[i][v2[i].size()-1]));
			v1[i].pop_back();
			v2[i].pop_back();cnt++;
		}
		while(v1[i].size()>0&&v2[26].size()>0){
			ans.push_back(make_pair(v1[i][v1[i].size()-1],v2[26][v2[26].size()-1]));
			v1[i].pop_back();
			v2[26].pop_back();cnt++;
		}
		while(v1[26].size()>0&&v2[i].size()>0){
			ans.push_back(make_pair(v1[26][v1[26].size()-1],v2[i][v2[i].size()-1]));
			v1[26].pop_back();
			v2[i].pop_back();cnt++;
		}
	}
	printf("%d\n",cnt);
	for(i=0;i<cnt;i++){
		printf("%d %d\n",ans[i].first,ans[i].second);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41829060/article/details/89423059