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;
}

目录
相关文章
|
7月前
|
运维 安全 网络安全
VMware NSX 4.2.1.3 下载 - 网络安全虚拟化平台
VMware NSX 4.2.1.3 下载 - 网络安全虚拟化平台
226 0
VMware NSX 4.2.1.3 下载 - 网络安全虚拟化平台
|
8月前
|
弹性计算 运维 自然语言处理
产品测评 | 感受操作系统智能助手OS Copilot新功能带来的运维效率飞升
近期,我再次评测了阿里云OS Copilot的新版本,发现其在命令执行、任务自动化、文件处理及知识问答等方面表现出色,特别是-t参数显著提升了70%的效率。使用过程中,我发现它不仅简化了复杂任务的处理,还提供了中文解释配置文件的功能,极大地方便了初学者。总结来看,OS Copilot极大地提升了Linux运维效率,但仍需在自然语言理解、用户界面优化和错误处理机制等方面进一步改进。未来若能支持更多操作系统并集成更多实用工具,必将成为Linux用户的得力助手。
|
11月前
|
自然语言处理 Linux iOS开发
【推荐】博客创作必备工具✨
为了帮助博主们更高效地创作和发布内容,本文汇总了从 Markdown 编辑器、截图工具、绘图工具到发布工具的写博客必备工具。这些工具涵盖了文本编辑、图片处理、图表绘制、GIF 录制和多平台发布等多个方面。无论你是初学者还是经验丰富的创作者,这些工具都会为你提供全方位的支持,助力你轻松高效地完成博客创作和发布。
417 64
|
缓存 安全 API
阿里云云效产品使用合集之在外面出差需要访问被设置为内网或IP白名单限制的代码库,该如何操作
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
存储 前端开发 小程序
Uniapp数据展示
Uniapp数据展示
180 0
|
SQL 分布式计算 安全
jps查看进程出现「xxxx -- process information unavailable」
jps查看进程出现「xxxx -- process information unavailable」
1980 0
jps查看进程出现「xxxx -- process information unavailable」
蚂蚁金服发布「定损宝」,推动图像定损技术在车险领域的应用
6 月 27 日,蚂蚁金服在北京宣布向保险行业全面开放技术产品「定损宝」,用 AI 技术模拟车险定损环节中的人工作业流程,帮助保险公司实现简单高效的自动定损,成为图像定损技术在车险领域的首次商业应用。
1727 0
蚂蚁金服发布「定损宝」,推动图像定损技术在车险领域的应用
|
网络协议 网络虚拟化 数据安全/隐私保护
路由与交换系列之NAPT特性与配置实践
• 掌握NAPT的原理 • 掌握NAPT在企业网络中的应用 • 掌握NAPT的配置方式
3119 1
路由与交换系列之NAPT特性与配置实践
|
负载均衡 NoSQL Linux
【Docker部署Redis集群】分片+高可用+负载均衡
【Docker部署Redis集群】分片+高可用+负载均衡
522 0
【Docker部署Redis集群】分片+高可用+负载均衡
|
JavaScript 前端开发
【JavaScript】DOM查询(子节点、父节点、兄弟节点)源码详解
文章目录 获取元素节点的子节点 获取父节点和兄弟节点 扩展:获取和修改input文本标签中的值
【JavaScript】DOM查询(子节点、父节点、兄弟节点)源码详解