YC316B [ 20240706 CQYC省选模拟赛 T2 ] 题目描述(statement)

题意

给定两个长度为 \(k\) 的字符串 \(s, t\)

设两个字符串的相似度为 \(\sum_{i = 1} ^ {k} [s_i = t_i]\)

给定 \(n\) 个操作,每次操作交换 \((s_{x}, s_{y})\),你需要求出对于所有 \(\forall l, r, r - l + 1 \ge m\) 的相似度最大的 \(l, r\)

\(n \le 10 ^ 6, k \le 20\)

Sol

显然直接从 \(l \to r\) 是不好做的。

手玩一下这个操作可以发现若 \(s, t\) 同时做某些操作,相似度是不变的。

其次显然这个操作是可逆的,用 \(t\)\(r\) 做到 \(l\)\(s\)\(l\) 做到 \(r\) 是等价的。

因此我们可以构造出一种方式,让 \(s\)\(l\) 操作到 \(n\)\(t\)\(r + 1\) 操作到 \(n\),然后再求两串的相似度。

集中注意力,考虑怎么让相似度好算一点。

发现使相似度最大等价于两串相同为 \(1\) 的位数最多,因为两串 \(1\) 的个数确定,拆开过后就之和相同 \(1\) 的位数有关了。

发现值域很小,直接暴力上 \(\text{dp}\),设 \(f_{0, S}\) 表示 \(S \subseteq s\) 的最小左端点, \(f_{1, S}\) 表示 \(S \subseteq t\) 的最大右端点,\(S\) 的含义是 \(S\) 集合中的这些位有相同的 \(1\)

简单 \(\text{dp}\) 一下,判断左右端点的长度,最后输出最大的 \(\text{popcount}\) 即可。

posted @ 2024-07-12 21:51  cxqghzj  阅读(2)  评论(0编辑  收藏  举报