YC316B [ 20240706 CQYC省選模擬賽 T2 ] 題目描述(statement)

cxqghzj發表於2024-07-12

題意

給定兩個長度為 \(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}\) 即可。

相關文章