CF1800E2. Unforgivable Curse (hard version) 题解 并查集

news/2024/10/24 15:04:55

题目链接:https://codeforces.com/contest/1800/problem/E2

视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp?p=2

把下标 \(i\) 对应到图中编号为 \(i\) 的节点。

节点 \(i\)\(i+k\) 之间连一条边,节点 \(i\)\(i+k+1\) 之间也连一条边。

同一个连通块里的节点对应的字符可以互相换。

然后可以发现,在和节点 \(i\) 处在同一个并查集的所有节点(对应到字符串 \(s\)\(t\) 中是下标)在 \(s\)\(t\) 中的所有字符必须是一样的。

具体来说,假设节点 \(2\) 所在的连通块的节点集合为 \(\{ 2, 3, 4, 5, 7, 11 \}\),则:

  • \(s_2, s_3, s_4, s_5, s_7, s_{11}\) 中字符 'a' 出现的次数需要和 \(t_2, t_3, t_4, t_5, t_7, t_{11}\) 中字符 'a' 出现的次数相同;
  • \(s_2, s_3, s_4, s_5, s_7, s_{11}\) 中字符 'b' 出现的次数需要和 \(t_2, t_3, t_4, t_5, t_7, t_{11}\) 中字符 'b' 出现的次数相同;
  • ……
  • \(s_2, s_3, s_4, s_5, s_7, s_{11}\) 中字符 'z' 出现的次数需要和 \(t_2, t_3, t_4, t_5, t_7, t_{11}\) 中字符 'z' 出现的次数相同。

只有满足上述所有条件,字符串 \(s\) 才能变得和字符串 \(t\) 相等。

代码实现时,我用 \(cnt1_{i,j}\) 表示字符串以 \(i\) 为根节点的节点集合对应字符串 \(s\) 中字符 \(j\) 出现的次数,用 \(cnt2_{i,j}\) 表示字符串以 \(i\) 为根节点的节点集合对应字符串 \(t\) 中字符 \(j\) 出现的次数。

则必须要满足:

对于任意 \(1 \le i \le n, 0 \le j \le 25\) 都有 \(cnt1_{i,j} = cnt2_{i,j}\) 才输出 YES;否则,输出 NO

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;int T, n, k, f[maxn], cnt1[maxn][26], cnt2[maxn][26];
char s[maxn], t[maxn];void init() {for (int i = 1; i <= n; i++) {f[i] = i;for (int j = 0; j < 26; j++)cnt1[i][j] = cnt2[i][j] = 0;}
}int find(int x) {return x == f[x] ? x : f[x] = find(f[x]);
}void funion(int x, int y) {int a = find(x), b = find(y);f[a] = f[b] = f[x] = f[y] = min(a, b);
}bool check() {for (int i = 1; i <= n; i++)for (int j = 0; j < 26; j++)if (cnt1[i][j] != cnt2[i][j])return false;return true;
}int main() {scanf("%d", &T);while (T--) {scanf("%d%d%s%s", &n, &k, s+1, t+1);init();for (int i = 1; i + k <= n; i++) {funion(i, i+k);if (i+k+1 <= n)funion(i, i+k+1);}for (int i = 1; i <= n; i++) {cnt1[find(i)][s[i]-'a']++;cnt2[find(i)][t[i]-'a']++;}puts(check() ? "YES" : "NO");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/75489.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

吉客云数据集成到金蝶云星空:盘盈入库单对接方案

吉客云数据集成到金蝶云星空:盘盈入库单对接方案 在企业资源管理中,数据的准确性和实时性至关重要。本文将分享一个具体的系统对接集成案例,即如何将吉客云中的盘盈入库单数据高效、可靠地集成到金蝶云星空中,形成盘盈单。 为了实现这一目标,我们采用了数据集成平台,通过…

Linux 中 awk命令整列的替换

001、测试数据[root@localhost test2]# ls a.txt [root@localhost test2]# cat a.txt 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 …

ElevenLabs Voice Design :可通过文本创建个性化语音;苹果推出首个开发者测试版丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

nginx总结

使用auth_basic控制访问nginx代理的网站,直接访问如果需要添加安全性,如需要输入用户名+密码才能访问页面,可以通过nginx的auth_baisc配置来实现检查htpasswd 一般nginx的安装之后会自带或者nginx容器镜像自带 root@ea6255db9f51:/config/nginx/site-confs# htpasswd Usage:…

1024程序员节Fast Request发福利啦

今天是 1024 程序员节,祝各位老铁程序员节快乐!愿大家安全上线,永无 bug,代码行行如丝滑。 首先,特别感谢大家一直以来对 Fast Request 的支持与厚爱。在这个属于程序员的节日里,我们准备了一波诚意满满的福利,送给每一位辛勤付出的你! 以下福利是我们对大家辛勤付出的…

浪潮服务器开机不进系统

浪潮服务器开机无法进入系统的问题,可能由多种因素导致。以下是一些常见的原因及其相应的解决方法: 一、电源故障 问题描述:电源故障可能导致服务器无法正常启动。 解决方法: 检查电源插头和电源线是否松动或损坏。 确保电源供应正常,尝试更换电源线或连接到其他插座进行测…

Cinemachine系列——AimComposer

这个虚拟摄像机的瞄准算法会旋转摄像机,使其朝向指定的“注视”目标。同时,它还会应用偏移量、阻尼效果和构图规则。 主要要点: 朝向目标:摄像机会自动调整其方向,以面向指定的注视目标,例如角色的上脊椎或头骨、车辆,或通过程序控制或动画的虚拟对象。 偏移量:可以为摄…

Qt/C++路径轨迹回放/回放每个点信号/回放结束信号/拿到移动的坐标点经纬度

一、前言说明 在使用百度地图的路书功能中,并没有提供移动的信号以及移动结束的信号,但是很多时候都期望拿到移动的哪里了以及移动结束的信号,以便做出对应的处理,比如结束后需要触发一些对应的操作。经过搜索发现很多人都有这个需求,需要在js文件中加上一点代码才行,也就…