Codeforces 1204D Kirk and a Binary String - 數學

題目傳送門

  傳送門

  羣除我均會猜結論/找規律,sad....

  以下內容只保證代碼能過system test,證明應該都是在純口胡

  約定下文中的$LIS$表示最長不下降子序列。

  定義$zero(s)$表示串$s$中0的個數,$one(s)$表示$s$中1的個數。

  約定字符串的下標從1開始。$s_{l, r}$表示$s$的$l$個字符開始到第$r$個字符組成的子串。

  定義一個串$s$是fixed string,當且僅當滿足下面任意一個條件:

  • $s$是一個空串
  • $s = 1t0$, 並且$t$是一個fixed string。
  • $s = pq$,並且$p,q$都是非空fixed string。

  不難根據定義證明:fixed string必定滿足0和1出現次數相同,fixed string的串長總是偶數。

引理1 fixed string的LIS長度等於長度的一半。

  證明 考慮使用歸納法來證明。爲了方便起見,以下的$k$默認爲偶數,因爲是奇數的時候等價於爲$k - 1$時的命題。

  當串長爲0的時候顯然成立。

  假設當串長小於等於$k$時成立,考慮串長等於$k + 2$的時候。設這個fixed string爲$s$。

  • 若$s = 1t0$,那麼有:

    $$
    \begin {align}
    LIS(1t0) &= \max\{LIS(1t), LIS(t0), LIS(t)\} \\
    &= \max \{\max\{1 + one(t), LIS(t)\}, \max\{zero(t) + 1, LIS(t)\}, LIS(t)\} \\
    &= \frac{|t|}{2} + 1 \\
    &= \frac{|s|}{2}
    \end{align}
    $$

  • 若$s = pq$。考慮無論在LIS在$p$中是怎麼樣的,$q$中至多隻能選出$\frac{|q|}{2}$個數。
    所以有$LIS(s) \leqslant \frac{|s|}{2}$,又因爲全取0或全取1可以達到這個上界,所以有$LIS(s) = \frac{|s|}{2}$。

定理2 如果$s$是一個fixed string,那麼不存在另一個01串$t$,滿足

  • $s\neq t$
  • $s$的所有子串和$t$的所有子串的LIS長度相同。

  證明 仍然考慮歸納法證明。

  顯然, 當是空串的時候顯然成立。

  假設當串長小於等於$k$時成立,考慮串長等於$k + 2$的時候。假設存在一個串$s'$滿足條件。

  • 如果$s = pq$,設$s' = ab\ (|a| = |p|, |b| = |q|)$,那麼根據歸納假設有$a = p, b = q$。
  • 如果$s = 1a0$。不難得到$s' = bac$,其中$b,c$是一個字符。
    如果$s' = 0a0$或者$s' = 1a1$或者$s' = 0a1$,那麼整個串的LIS長度爲$|s|/2 + 1$。
    因此不存在這樣的$s'$

  所以如果一個子串是fixed string,那麼答案中它不會改變。

  考慮怎麼找到一些fixed string。

  定義$D(s) = one(s) - zero(s)$,定義$f(s) = \max_{1 \leqslant i\leqslant |s|} D(s_{i:|s|}) $。如果$s$是一個空串,那麼約定$f(s) = 0$

定理3 $s$是一個fixed string當且僅當

  • $one(s) = zero(s)$
  • $f(s) = 0$

  證明 必要性 第一條顯然。

  第二條考慮用歸納法證明。

  當$s = 1t0$,

$$
\begin{align}
f(1t0) &= \max\{0, f(t0)\} \\
&= \max \{0, f(t) - 1\} \\
&= 0
\end{align}
$$

  當$s = pq$,有$f(pq) = \max\{f(p) + zero(q) - one(q), f(q)\} = 0$。

  充分性 當$s$是一個空串的時候結論顯然成立。

  假設$ \max_{1 \leqslant i\leqslant |s|} D(s_{i:|s|})$在$i = j > 1$時取到了0,那麼$s_{1 : j - 1}, s_{j, |s|}$顯然滿足兩個條件。

  否則$s = 1t0$,如果第一位爲0,那麼說明,$f(s) > 0$,矛盾。所以第一位一定爲$1$。如果最後一位爲1,那麼也說明$f(s) > 0$。

  因爲$f(t0) < 0$,所以有$f(t) \leqslant 0$,因爲$t$有相等的0和1,所以$f(t) = 0$。

引理4 串$s$不存在任何fixed string當且僅當不存在一個1在某個0的前面。

  證明 否則考慮某對相鄰的$10$。

  考慮這樣一個做法:

#include <bits/stdc++.h>
using namespace std;
typedef bool boolean;

int n;
char s[100005];

int main() {
	int sum = 0;
	scanf("%s", s + 1);
	n = strlen(s + 1);
	for (int i = n; i; i--) {
		(s[i] == '0') ? (--sum) : ((!sum) ? (s[i] = '0') : (++sum));
	}
	puts(s + 1);
	return 0;
}

  顯然它將不在fixed string中的1都變爲0。

  顯然它是答案的一個上界。因爲fixed string中的字符不能改動,剩下的把1都變成0。

  現在我們來證明它合法並且它同時也是答案的一個下界並且它一定合法。

  考慮

$$
\begin{align}
LIS(s) = zero(s) + \max \{0, \max_{1\leqslant k\leqslant |s|} one(s_{k:|s|}) - zero(s_{k:|s|}) \}
\end{align}
$$

  考慮如果每次我們只將一個1改爲0,那麼怎樣會使得某個包含它的串$t$的LIS長度不會改變。

  注意到$zero(t')$一定會增加1,那麼後面的函數必須減少1。

  假設我們修改的位置是$i$,那麼函數$g(k) = one(t_{k:|t|}) - zero(s_{k:|t|})$,在$[1, i]$的取值會減少2。

  這意味着,如果我只修改把一個1改爲0,那麼必須要使得$\max_{k > i} g(k)$等於最大值減1。

  那麼回到原串,修改一個不在fixed string中的位置$i$,等於對所有包含它的子串都要滿足條件。

  考慮每次選擇在交界處的1,把它改爲0,考慮任意一個從$l$開始在$j$結束且包含修改位置$i$的子串,那麼有:

  考慮$l$所截斷的fixed string,這是一個fixed string的後綴。它的後綴最大值小於等於0。所以不會改變後綴最大值。下面將不再考慮這一部分。

  因爲$i$左側存在不在fixed string中的0,所以根據fixed string的性質有$\max_{l\leqslant k \leqslant i} D(s_{k, j}) = D(s_{i, j})$。

  考慮$j$所截掉的fixed string,這是一個fixed string的前綴,它仍然滿足後綴最大值等於它本身的$D$函數值。

  在這個被截掉的fixed string之前,後綴最大值會改變當且僅當遇到不在fixed string中的1,這個變化顯然是連續的。

  因此最大值在$i$處取到,並且存在一個值等於最大值減1。

  這樣就證明那是答案的一個下界。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章