codeforces1141D Colored Boots(暴力+贪心)

简介: codeforces1141D题解(暴力+贪心)

给出两个长度为 n(1≤n≤150000)的仅含有小写字母和'?'的字符串,询问两个字符串最多能有几对匹配的字符。
(每个字母都可以与和它相同的字符匹配,'?'可以与任意字符匹配,匹配与位置无关)
输出最大匹配对数,以及每一对中两个字符在字符串中的位置

/*
 * codeforces1141D Colored Boots 
 * Created by hao on 2019/4/11.
 * 给出两个长度为 n(1≤n≤150000)的仅含有小写字母和'?'的字符串,询问两个字符串最多能有几对匹配的字符。
 * (每个字母都可以与和它相同的字符匹配,'?'可以与任意字符匹配,匹配与位置无关)
 * 输出最大匹配对数,以及每一对中两个字符在字符串中的位置
 */
#include <cstdio>
#include <cstring>
#include<iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>

using namespace std;
#define ll long long
#define mp make_pair
#define ff first
#define ss second
#define pub push_back
#define pob pop_back()
#define pof pop_front()
vector<int> l[250], r[250];
vector<pair<int, int> > ans;

int main() {
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    string s1, s2;
    cin >> s1 >> s2;
    //让每一个字符对应自己的位置(下表+1)
    for (int i = 0; i < s1.length(); i++) {
        l[(int) s1[i]].pub(i + 1);
    }
    for (int i = 0; i < s2.length(); i++) {
        r[(int) s2[i]].pub(i + 1);
    }
    //记录'?'对应的int值,防止'?'和'?'优先匹配
    int q = (int) '?';
    for (int i = 0; i < 250; i++) {
        //等于'?'时跳过,防止'?'优先匹配。
        if (i == q) continue;
        //匹配相同的字符,比如'a','a','b','b'
        while (!l[i].empty() && !r[i].empty()) {
            ans.pub(mp(l[i].back(), r[i].back()));
            l[i].pob;
            r[i].pob;
        }
        //让第一个字符串的'?'和第二个字符串的任意字符匹配
        while (!l[q].empty() && !r[i].empty()) {
            ans.pub(mp(l[q].back(), r[i].back()));
            l[q].pob;
            r[i].pob;
        }
        //让第一个字符串的任意字符和第二个字符串的'?'匹配
        while (!l[i].empty() && !r[q].empty()) {
            ans.pub(mp(l[i].back(), r[q].back()));
            l[i].pob;
            r[q].pob;
        }
    }
    //在所有的除去'?'的字符都处理完之后,处理'?'和'?'的情况
    while (!l[q].empty() && !r[q].empty()) {
        ans.pub({l[q].back(), r[q].back()});
        l[q].pob;
        r[q].pob;
    }
    //输出匹配对数
    cout << ans.size() << endl;
    //输出匹配的对数的相应的两个位置
    for (int i = 0; i < ans.size(); i++) {
        cout << ans[i].ff << " " << ans[i].ss << endl;
    }

    return 0;
}

目录
相关文章
|
10月前
蓝桥杯:暴力求解四平方和
蓝桥杯:暴力求解四平方和
38 0
|
人工智能 算法 搜索推荐
LeetCode 周赛 338,贪心 / 埃氏筛 / 欧氏线性筛 / 前缀和 / 二分查找 / 拓扑排序
大家好,我是小彭。 上周末是 LeetCode 第 338 场周赛,你参加了吗?这场周赛覆盖的知识点很多,第四题称得上是近期几场周赛的天花板。
80 0
|
算法 Java Python
【算法题解】 Day5 贪心
今天的算法是 「贪心」 相关,“算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,以实战习题的形式理解算法,使用算法。”
64 0
|
人工智能
Codeforces-1260-E. Tournament贪心
题意: 有n个人,第i个人有力量值i,这n个人中,每次对局两两之间进行solo,如果说一个人的力量之大于他的对手,这个人是赢的,赢得比赛的选手会进入下一轮比赛中。 然而里面有一个人为你的朋友,他或许并不是里面最强的人,要想让朋友成为冠军,就需要对必要的人进行贿赂,求出最少需要花费多少才能使得朋友成为冠军。在每次对局中,都可以进行任意的对局安排,对局安排只取决于自己
75 0
|
算法
力扣每日一题:134.加油站 贪心+暴力双解
力扣每日一题:134.加油站 贪心+暴力双解
190 0
|
人工智能 算法 BI
【解题报告】《LeetCode零基础指南》(第七讲) 贪心(1)
【解题报告】《LeetCode零基础指南》(第七讲) 贪心(1)
【解题报告】《LeetCode零基础指南》(第七讲) 贪心(2)
【解题报告】《LeetCode零基础指南》(第七讲) 贪心(2)
|
人工智能
codeforces1143B Nirvana(贪心)
codeforces1143B题解(贪心)
947 0