解法

这题比赛时过的人很多,我却没思路,糊里糊涂写了个强联通分量,得了 80 分。

这题思路是这样的。

一个替换操作可以看做一个有向边,所以题目实际上给出了一个有向图 $G$,一个节点代表一个字母。

注意题目要求每个操作都必须执行一次。

关于自环

首先注意到自环是没有意义的,因此处理输入时把自环忽略掉。

这里需要特别说明自环的问题,题目描述中并没有说明 $X_i \ne Y_i$。不过似乎可以合理地假设输入中不存在 $X_i = Y_i$ 的操作。

有些 AC 的代码并没有判断自环,比如冰心水蜜桃的提交。当输入中有自环时,这个代码是有 BUG 的。

关于重边

实际上重边也是没有意义的,但是我们不必特别处理它。


用 $\mathsf{h}$ 表示 $G$ 中对应于字符 ‘h’ 的节点。

设字符 $x$ 在串 $S$ 中出现过且 $x$ 不是 ‘h’ 将 $x$ 出现的次数记做 $c_x$ 。则这 $c_x$ 个 $x$ 能转变为 ‘h’ 的充要条件是「图 $G$ 中存在一条从 $x$ 到 ‘h’ 的简单路径」。

证明:不失一般性,设 $x\to x_1 \to x_2 \to \mathsf{h}$ 是一条从 $x$ 到 ‘h’ 的简单路径,则我们可以按下述方法将 $x$ 变为 ‘h’。

首先将 $x$ 变为 $x_1$,这个操作用掉了 $(x\to x_1)$ 这条边;再将剩下的从 $x$ 发出的边全部用掉,这些边将不换改变当前的字符串,然后把所有从 $x$ 发出的边从图 $G$ 中删除。以此类推。

不难注意到若 ‘h’ 有出边,则上述论证是有问题的。

‘h’ 的出度为零的情形是平凡的。考虑 ‘h’ 的出度不为零的情形。此时若图 $G$ 中不存在「从 ‘h’ 到 ‘h’ 的回路」,则若初始字符串 $S$ 中有 ‘h’,则这些 ‘h’ 终将变成别的字符。因此在这种情况下我们可以将 ‘h’ 的所有出边先执行一遍,并把这些边从图 $G$ 中删除。

这样就完成了上述论证。

不过至此我们只是针对一个字符 $x$ 进行论证。实际上对多个字符,结论是一样的,证明留给读者。


现在来考虑图 $G$ 中存在从 ‘h’ 到 ‘h’ 的回路的情形。注意这样的回路一定不是自环。任取一个从 ‘h’ 到 ‘h’ 的回路 $C$,我们可以先把 'h' 变成回路 $C$ 上 'h' 的后继,得到一个新字符串 $S'$,并把图 $G$ 中其他的 ‘h’ 的出边删除。这样就把问题规约为上一段所描述的情形。

实现

我们需要判断的是,对于字符 $x\in S$ 且 $x\ne\mathsf{h}$,图 $G$ 中是否有一条从 $x$ 到 $\mathsf{h}$ 的简单路径,这可以通过 DFS 完成。另外当 $\mathsf{h}$ 的出度不为零时我们需要判断图 $G$ 中是否存在一条从 $\mathsf{h}$ 到 $\mathsf{h}$ 的回路。先进行DFS,确保字符串 $S$ 中所有字符都被访问过。遍历每一条以 $\mathsf{h}$ 为起点的边 $(\mathsf{h} \to x)$,判断图 $G$ 中是否存在从 $x$ 到 $\mathsf{h}$ 的简单路径。

也可以把边反向以后建图,这样只要对 $\mathsf{h}$ 调用一次 DFS 就可以了。

Implementation

#include <bits/stdc++.h>
using namespace std;int main() {//freopen("main.in", "r", stdin);int n; cin >> n;string s; cin >> s;vector<int> cnt(26);for(auto ch: s) cnt[ch-'a']++;vector<vector<int>> g(26);vector<bool> to_h(26);bool flag = false;while (n--) {char x, y; cin >> x >> y;if (x != y) {g[y-'a'].push_back(x-'a');if(x == 'h') {to_h[y-'a'] = true;flag = true;}}}function<void(int)> dfs;vector<bool> vis(26);dfs = [&](int u) {vis[u] = true;for(auto v: g[u]) {if(!vis[v]) dfs(v);}};int h = 'h' - 'a';dfs(h);int ans = 0;for (int i = 0; i < 26; i++)if(vis[i]) ans += cnt[i];if (flag) {for (int i = 0; i < 26; i++)if (to_h[i] && vis[i]) {flag = false;break;}if (flag) ans -= cnt[h];}cout << ans << endl;return 0;
}

转载于:https://www.cnblogs.com/Patt/p/10170820.html

hihoCoder #1902 字符替换相关推荐

  1. notepad宏的使用,定制各种操作,比如删除一整行、从当前位置到行末用某字符替换

    删除一整行 点击菜单中的[宏]-[开始录制]. 鼠标在任意一行内容上单击,使光标停在这行.然后在键盘上找到home键,按下,这时光标不管之前在哪个位置,现在光标都会出现在这行的最前面,这时按住shif ...

  2. C语言实现:输入一串字符把里面的A、a字符替换成C输出

    C语言实现:输入一串字符把里面的A.a字符替换成C输出 #include "stdafx.h" #include<stdio.h> #include<string ...

  3. TureType/OpenType 字体瘦身、字体转换和字符替换

    TureType/OpenType 字体瘦身.字体转换和字符替换 本文讲解下面一些关于 TTF/OTF 字体的基本知识和操作: 什么是TTF和OTF字体 删除/插入/替换字体中的字符 TTF/OTF ...

  4. js中字符替换函数String.replace()使用技巧

    String.replace( ) 简介 语法: var strings = string.replace(regexp, replacement) regexp :您要执行替换操作的正则表达式,如果 ...

  5. oracle 存储过程字符替换,Oracle存储过程常用字符串处理函数整理

    1.CHR(x): 返回在数据库字符集中与X拥有等价数值的字符.CHR和ASCII是一对反函数.经过CHR转换后的字符再经过ASCII转换又得到了原来的字符 begin -- 打印CHR(73)的值 ...

  6. AC日记——字符替换 openjudge 1.7 08

    08:字符替换 总时间限制:  1000ms 内存限制:  65536kB 描述 把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串. 输入 只有一行,由一个字符串和两个字符组成,中间用 ...

  7. scala字符替换_如何替换Scala中的“坏”字符?

    scala字符替换 In Scala, programming language, all sorts of special characters are valid. The character s ...

  8. shell变量里的字符替换

    shell变量里的字符替换 b=${a/123/321};将${a}里的第一个123替换为321 b=${a//123/321};将${a}里的所有123替换为321 shell调试: sh -x a ...

  9. 1.7.08:字符替换

    08:字符替换 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串. 输入 只有一行,由一个字符 ...

最新文章

  1. Excel公式与函数案例速查手册/电脑技巧从入门到精通丛书
  2. 不同时间段的欢迎语言
  3. 08_drain a node on the swarm
  4. $ is not defined 如何解决
  5. cimage和gdi绘图效率比较_使用MFC CImage类和GDI+ Image加载并绘制PNG图片
  6. 非线性动力学 matlab,非线性动力学matlab
  7. [80386]80x86汇编指令
  8. 计算机软件研究方法与技术路线,研究方法与技术路线
  9. 案例:京东登录页面css创建
  10. 摄影毁一生单反穷三代顺口溜_在美院读摄影专业是什么体验?不是累成狗也不是毁一生。...
  11. 取出汉字的拼音首字母
  12. 「技术分享」工业触摸屏之触摸屏分类(连载)
  13. (12)全民小视频引流脚本模块化开发06-已关注用户取关By飞云脚本学院
  14. C语言十进制转换为其他进制(二进制图解+代码)
  15. 数据案例-蓝米手机的精准广告营销
  16. mysql 如何获取当前时间 前、后一小时的时间?
  17. SVG实例详解系列(一)(svg概述、位图和矢量图区别(图解)、SVG应用实例)
  18. IOS开发语言Swift入门连载---基础部分
  19. 国际象棋通用协议(UCI协议)
  20. selenium+python环境布置

热门文章

  1. java神秘岛_我的世界1.4.2喵喵苍炎冒险整合包1.1含服务端(含IC,BC,暮色,神秘岛,,PAM世界等MOD)...
  2. 湖南大学夏令营 ---- 信息科学与工程学院
  3. 【锐捷无线】胖AP模式限速
  4. Pinterest未来路在何方
  5. html5移动手机页面怎么做自适应-来自于三人行慕课
  6. 【错误日志dubbo】Failed to invoke remote method: sayHello, provider:dubbo://192.168.2.xxx
  7. 微信小程序云开发之微信支付
  8. 成都房地产行情解析,商铺回报率高于住宅市场
  9. 经典测试案例:三角形的测试
  10. ts 流基础(白话讲解).