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