考慮對操作進行轉換。假設 \(a_i\) 為第 \(i\) 個 \(1\) 前面的 \(0\) 的個數。
則操作可以進行如下轉換:
轉換 1:選擇一個長度為 \(k + 1\) 的子區間 \(a_{l ~ l + k}\)。我們先把 \(a_{l + 1 ~ l + k - 1}\) 翻轉,然後更改 \(a_l\) 和 \(a_{l + k}\) 使得 \(a_l + a_{l + k}\) 不變。
轉換 2:操作是可逆的,所以若我們能把 \(S, T\) 都轉換成同一個字串 \(I\),那麼 \(S \rightarrow T\) 就是可行的。
於是現在的問題是能否把 \(S, T\) 轉換成同一個 \(I\)。
現在我們想要把 \(a\) 陣列不為 \(0\) 的值儘量往前移,且我們有 \(2\times n\) 的操作次數。
容易發現,當我們翻轉了一個 \(a_{l ~ l + k}\) 時,我們可以讓 \(\begin{cases}a_l = a_l + a{l + k}\\a_{l + k} = 0\end{cases}\),這樣我們操作了 \(n - k\) 次後,只會有 \(a\) 的前 \(k + 2\) 個位置有值。
然後我們考慮如何把前 \(k + 2\) 個位置移到第 \(1\) 個位置。
若我們每次操作 \(a_{1 ~ k + 1}\) 和 \(a_{2 ~ k + 2}\),則每次 \(a_{2 ~ k + 1}\) 會先進行長度為 \(2\) 的迴圈位移,然後把前兩個數設為 \(0\)。
經過 \(\lfloor \frac{k}{2} \rfloor \times 2\) 次操作後,\(\forall 2 \leq i \leq k + 1, a_i = 0\)。
然後,分類討論。
先考慮 \(2 \ |\ k\) 的情況。我們發現,奇數編號的位置不可能轉到偶數編號的位置,所以不可能。
再考慮 \(k\) 為奇數的情況。這時候,我們只要 \(a_{2, k + 2}\) 和 \(a_{1, k + 1}\) 輪流操作即可。次數 \(k + 1\)。
時間複雜度 \(\mathcal{O}(n ^ 2)\),操作次數最大為 \(n + k + 1\)。由於 \(k = n\) 時不可能存在解,所以滿足限制。
程式碼咕了。