Codeforces Round #547 (Div. 3)D. Colored Boots【模拟,字符串】

D. Colored Boots

题目大意:给你两个字符串,问你这两组字符串相同字符在各自所在字符的位置是如何。而且每一个字符串中“?”字符可以与任何字符相匹配。

大致思路:这道题的贪心思路很好想:先找连个字符串中字符相同的,再找第一个字符串和第二个串字符“?”匹配的,再找第一个字符串中“?”和第二个字符串中字符相匹配的,最后找两个字符串中剩下的“?”字符。

难点在于这道题的代码实现:我们可以先用一个二维数组把字符串中的每一个字符在其相应字符串的位置存起来,然后我们可以便利a ~ z的所有字符,在两个字符串中去查找有没有相应的字符,如果有则把得出相应字符的位置,然后将其从二维数组中删去。

制止该字符所有位置全部找到为止。

#include 

using namespace std;

const int MAXN = 2e5 + 10;
typedef pair P;
vector

ans; vector l[300]; vector r[300]; int n; char s1[MAXN],s2[MAXN]; int main(int argc, char const *argv[]) { scanf("%d",&n); scanf("%s",s1 + 1); scanf("%s",s2 + 1); for(int i = 1; i <= n; i++) { l[s1[i]].push_back(i); r[s2[i]].push_back(i); } for(char c = 'a'; c <= 'z'; c++) { while(l[c].size() && r[c].size()){ P temp = make_pair(l[c].back(),r[c].back()); ans.push_back(temp); l[c].pop_back(),r[c].pop_back(); } } for(char c = 'a'; c <= 'z'; c++) { while(l[c].size() && r['?'].size()) { P temp = make_pair(l[c].back(),r['?'].back()); ans.push_back(temp); l[c].pop_back(),r['?'].pop_back(); } while(l['?'].size() && r[c].size()) { P temp = make_pair(l['?'].back(),r[c].back()); ans.push_back(temp); l['?'].pop_back(),r[c].pop_back(); } } while(l['?'].size() && r['?'].size()) { P temp = make_pair(l['?'].back(),r['?'].back()); ans.push_back(temp); l['?'].pop_back(),r['?'].pop_back(); } cout << ans.size() << endl; for(int i = 0; i < ans.size(); i++) { P temp = ans[i]; cout << temp.first << " " << temp.second << endl; } return 0; }

 

你可能感兴趣的:(模拟,字符串)