Loading docs/string/pam.md +34 −34 Original line number Diff line number Diff line Loading @@ -171,19 +171,19 @@ border:若 $0 \le r < |s|$ , $pre(s,r)=suf(s,r)$ ,就称 $pre(s,r)$ 是 $s 周期和 border 的关系: $t$ 是 $s$ 的 border,当且仅当 $|s|-|t|$ 是 $s$ 的周期。 > 证明: > > 若 $t$ 是 $s$ 的 border,那么 $pre(s,|t|)=suf(s,|t|)$ ,因此 $\forall 1\le i \le |t|, s[i]=s[|s|-|t|+i]$ ,所以 $|s|-|t|$ 就是 $s$ 的周期。 > > 若 $|s|-|t|$ 为 $s$ 周期,则 $\forall 1 \le i \le |s|-(|s|-|t|)=|t|,s[i]=s[|s|-|t|+i]$ ,因此 $pre(s,|t|)=suf(s,|t|)$ ,所以 $t$ 是 $s$ 的 border。 证明: 若 $t$ 是 $s$ 的 border,那么 $pre(s,|t|)=suf(s,|t|)$ ,因此 $\forall 1\le i \le |t|, s[i]=s[|s|-|t|+i]$ ,所以 $|s|-|t|$ 就是 $s$ 的周期。 若 $|s|-|t|$ 为 $s$ 周期,则 $\forall 1 \le i \le |s|-(|s|-|t|)=|t|,s[i]=s[|s|-|t|+i]$ ,因此 $pre(s,|t|)=suf(s,|t|)$ ,所以 $t$ 是 $s$ 的 border。 引理 $1$ : $t$ 是回文串 $s$ 的后缀, $t$ 是 $s$ 的 border 当且仅当 $t$ 是回文串。 > 证明: > > 对于 $1 \le i \le |t|$ ,由 $s$ 和 $t$ 为回文串,因此有 $s[i]=s[|s|-i+1]=s[|s|-|t|+i]$ ,所以 $t$ 是 $s$ 的 border。 > > 对于 $1 \le i \le |t|$ ,由 $t$ 是 $s$ 的 border,有 $s[i]=s[|s|-|t|+i]$ ,由 $s$ 是回文串,有 $s[i]=s[|s|-i+1]$ ,因此 $s[|s|-i+1]=s[|s|-|t|+i]$ ,所以 $t$ 是回文串。 证明: 对于 $1 \le i \le |t|$ ,由 $s$ 和 $t$ 为回文串,因此有 $s[i]=s[|s|-i+1]=s[|s|-|t|+i]$ ,所以 $t$ 是 $s$ 的 border。 对于 $1 \le i \le |t|$ ,由 $t$ 是 $s$ 的 border,有 $s[i]=s[|s|-|t|+i]$ ,由 $s$ 是回文串,有 $s[i]=s[|s|-i+1]$ ,因此 $s[|s|-i+1]=s[|s|-|t|+i]$ ,所以 $t$ 是回文串。 下图中,相同颜色的位置表示字符对应相同。 Loading @@ -191,11 +191,11 @@ border:若 $0 \le r < |s|$ , $pre(s,r)=suf(s,r)$ ,就称 $pre(s,r)$ 是 $s 引理 $2$ : $t$ 是回文串 $s$ 的 border ( $|s|\le 2|t|$ ), $s$ 是回文串当且仅当 $t$ 是回文串。 > 证明: > > 若 $s$ 是回文串,由引理 $1$ , $t$ 也是回文串。 > > 若 $t$ 是回文串,由 $t$ 是 $s$ 的 border,因此 $\forall 1 \le i \le |t|, s[i]=s[|s|-|t|+i]=s[|s|-i+1]$ ,因为 $|s| \le 2|t|$ ,所以 $s$ 也是回文串。 证明: 若 $s$ 是回文串,由引理 $1$ , $t$ 也是回文串。 若 $t$ 是回文串,由 $t$ 是 $s$ 的 border,因此 $\forall 1 \le i \le |t|, s[i]=s[|s|-|t|+i]=s[|s|-i+1]$ ,因为 $|s| \le 2|t|$ ,所以 $s$ 也是回文串。 引理 $3$ : $t$ 是字符串 $s$ 的 border,则 $|s|-|t|$ 是 $s$ 的周期, $|s|-|t|$ 为 $s$ 的最小周期,当且仅当 $t$ 是 $s$ 的最长回文真后缀。 Loading @@ -209,23 +209,23 @@ border:若 $0 \le r < |s|$ , $pre(s,r)=suf(s,r)$ ,就称 $pre(s,r)$ 是 $s  > 证明: > > 1. 由引理 $3$ 的推论, $|u|=|x|-|y|$ 是 $x$ 的最小周期, $|v|=|y|-|z|$ 是 $y$ 的最小周期。考虑反证法,假设 $|u| < |v|$ ,因为 $y$ 是 $x$ 的后缀,所以 $u$ 既是 $x$ 的周期,也是 $y$ 的周期,而 $|v|$ 是 $y$ 的最小周期,矛盾。所以 $|u| \ge |v|$ 。 > > 2. 因为 $y$ 是 $x$ 的 border,所以 $v$ 是 $x$ 的前缀,设字符串 $w$ ,满足 $x=vw$ (如下图所示),其中 $z$ 是 $w$ 的 border。考虑反证法,假设 $|u| \le |z|$ ,那么 $|zu| \le 2|z|$ ,所以由引理 $2$ , $w$ 是回文串,由引理 $1$ , $w$ 是 $x$ 的 border,又因为 $|u| > |v|$ ,所以 $|w| > |y|$ ,矛盾。所以 $|u| > |z|$ 。 > > 3. $u,v$ 都是 $x$ 的前缀, $|u|=|v|$ ,所以 $u=v$ 。 > >  证明: 1. 由引理 $3$ 的推论, $|u|=|x|-|y|$ 是 $x$ 的最小周期, $|v|=|y|-|z|$ 是 $y$ 的最小周期。考虑反证法,假设 $|u| < |v|$ ,因为 $y$ 是 $x$ 的后缀,所以 $u$ 既是 $x$ 的周期,也是 $y$ 的周期,而 $|v|$ 是 $y$ 的最小周期,矛盾。所以 $|u| \ge |v|$ 。 2. 因为 $y$ 是 $x$ 的 border,所以 $v$ 是 $x$ 的前缀,设字符串 $w$ ,满足 $x=vw$ (如下图所示),其中 $z$ 是 $w$ 的 border。考虑反证法,假设 $|u| \le |z|$ ,那么 $|zu| \le 2|z|$ ,所以由引理 $2$ , $w$ 是回文串,由引理 $1$ , $w$ 是 $x$ 的 border,又因为 $|u| > |v|$ ,所以 $|w| > |y|$ ,矛盾。所以 $|u| > |z|$ 。 3. $u,v$ 都是 $x$ 的前缀, $|u|=|v|$ ,所以 $u=v$ 。  推论: $s$ 的所有回文后缀按照长度排序后,可以划分成 $\log |s|$ 段等差数列。 > 证明: > > 设 $s$ 的所有回文后缀长度从小到大排序为 $l_1,l_2,\dots,l_k$ 。对于任意 $2 \le i \le k-1$ ,若 $l_{i}-l_{i-1}=l_{i+1}-l_{i}$ ,则 $l_{i-1},l_{i},l_{i+1}$ 构成一个等差数列。否则 $l_{i}-l_{i-1}\neq l_{i+1}-l_{i}$ ,由引理 $4$ ,有 $l_{i+1}-l_{i}>l_{i}-l_{i-1}$ ,且 $l_{i+1}-l_{i}>l_{i-1}$ , $l_{i+1}>2l_{i-1}$ 。因此,若相邻两对回文后缀的长度之差发生变化,那么这个最大长度一定会相对于最小长度翻一倍。显然,长度翻倍最多只会发生 $O(\log |s|)$ 次,也就是 $s$ 的回文后缀长度可以划分成 $\log |s|$ 段等差数列。 > > 该推论也可以通过使用弱周期引理,对 $s$ 的最长回文后缀的所有 border 按照长度 $x$ 分类, $x \in [2^0,2^1),[2^1,2^2),\dots,[2^k,n)$ ,考虑这 $\log |s|$ 组内每组的最长 border 进行证明。详细证明可以参考金策的《字符串算法选讲》和陈孙立的 2019 年 IOI 国家候选队论文《子串周期查询问题的相关算法及其应用》。 证明: 设 $s$ 的所有回文后缀长度从小到大排序为 $l_1,l_2,\dots,l_k$ 。对于任意 $2 \le i \le k-1$ ,若 $l_{i}-l_{i-1}=l_{i+1}-l_{i}$ ,则 $l_{i-1},l_{i},l_{i+1}$ 构成一个等差数列。否则 $l_{i}-l_{i-1}\neq l_{i+1}-l_{i}$ ,由引理 $4$ ,有 $l_{i+1}-l_{i}>l_{i}-l_{i-1}$ ,且 $l_{i+1}-l_{i}>l_{i-1}$ , $l_{i+1}>2l_{i-1}$ 。因此,若相邻两对回文后缀的长度之差发生变化,那么这个最大长度一定会相对于最小长度翻一倍。显然,长度翻倍最多只会发生 $O(\log |s|)$ 次,也就是 $s$ 的回文后缀长度可以划分成 $\log |s|$ 段等差数列。 该推论也可以通过使用弱周期引理,对 $s$ 的最长回文后缀的所有 border 按照长度 $x$ 分类, $x \in [2^0,2^1),[2^1,2^2),\dots,[2^k,n)$ ,考虑这 $\log |s|$ 组内每组的最长 border 进行证明。详细证明可以参考金策的《字符串算法选讲》和陈孙立的 2019 年 IOI 国家候选队论文《子串周期查询问题的相关算法及其应用》。 有了这个结论后,我们现在可以考虑如何优化 $dp$ 的转移。 Loading @@ -241,11 +241,11 @@ border:若 $0 \le r < |s|$ , $pre(s,r)=suf(s,r)$ ,就称 $pre(s,r)$ 是 $s 最后,上述做法的正确性依赖于:如果 $x$ 和 $fail[x]$ 属于同一个等差数列,那么 $fail[x]$ 上一次出现位置是 $i-diff[x]$ 。 > 证明: > > 根据引理 $1$ , $fail[x]$ 是 $x$ 的 border,因此其在 $i-diff[x]$ 处出现。 > > 假设 $fail[x]$ 在 $(i-diff[x],i)$ 中的 $j$ 位置出现。由于 $x$ 和 $fail[x]$ 属于同一个等差数列,因此 $2|fail[x]| \ge x$ 。多余的 $fail[x]$ 和 $i-diff[x]$ 处的 $fail[x]$ 有交集,记交集为 $w$ ,设串 $u$ 满足 $uw=fail[x]$ 。用类似引理 $1$ 的方式可以证明, $w$ 是回文串,而 $x$ 的前缀 $s[i-len[x]+1..j]=uwu$ 也是回文串,这与 $fail[x]$ 是 $x$ 的最长回文前缀(后缀)矛盾。 证明: 根据引理 $1$ , $fail[x]$ 是 $x$ 的 border,因此其在 $i-diff[x]$ 处出现。 假设 $fail[x]$ 在 $(i-diff[x],i)$ 中的 $j$ 位置出现。由于 $x$ 和 $fail[x]$ 属于同一个等差数列,因此 $2|fail[x]| \ge x$ 。多余的 $fail[x]$ 和 $i-diff[x]$ 处的 $fail[x]$ 有交集,记交集为 $w$ ,设串 $u$ 满足 $uw=fail[x]$ 。用类似引理 $1$ 的方式可以证明, $w$ 是回文串,而 $x$ 的前缀 $s[i-len[x]+1..j]=uwu$ 也是回文串,这与 $fail[x]$ 是 $x$ 的最长回文前缀(后缀)矛盾。 例题: [Codeforces 932G Palindrome Partition](https://codeforces.com/problemset/problem/932/G) Loading Loading
docs/string/pam.md +34 −34 Original line number Diff line number Diff line Loading @@ -171,19 +171,19 @@ border:若 $0 \le r < |s|$ , $pre(s,r)=suf(s,r)$ ,就称 $pre(s,r)$ 是 $s 周期和 border 的关系: $t$ 是 $s$ 的 border,当且仅当 $|s|-|t|$ 是 $s$ 的周期。 > 证明: > > 若 $t$ 是 $s$ 的 border,那么 $pre(s,|t|)=suf(s,|t|)$ ,因此 $\forall 1\le i \le |t|, s[i]=s[|s|-|t|+i]$ ,所以 $|s|-|t|$ 就是 $s$ 的周期。 > > 若 $|s|-|t|$ 为 $s$ 周期,则 $\forall 1 \le i \le |s|-(|s|-|t|)=|t|,s[i]=s[|s|-|t|+i]$ ,因此 $pre(s,|t|)=suf(s,|t|)$ ,所以 $t$ 是 $s$ 的 border。 证明: 若 $t$ 是 $s$ 的 border,那么 $pre(s,|t|)=suf(s,|t|)$ ,因此 $\forall 1\le i \le |t|, s[i]=s[|s|-|t|+i]$ ,所以 $|s|-|t|$ 就是 $s$ 的周期。 若 $|s|-|t|$ 为 $s$ 周期,则 $\forall 1 \le i \le |s|-(|s|-|t|)=|t|,s[i]=s[|s|-|t|+i]$ ,因此 $pre(s,|t|)=suf(s,|t|)$ ,所以 $t$ 是 $s$ 的 border。 引理 $1$ : $t$ 是回文串 $s$ 的后缀, $t$ 是 $s$ 的 border 当且仅当 $t$ 是回文串。 > 证明: > > 对于 $1 \le i \le |t|$ ,由 $s$ 和 $t$ 为回文串,因此有 $s[i]=s[|s|-i+1]=s[|s|-|t|+i]$ ,所以 $t$ 是 $s$ 的 border。 > > 对于 $1 \le i \le |t|$ ,由 $t$ 是 $s$ 的 border,有 $s[i]=s[|s|-|t|+i]$ ,由 $s$ 是回文串,有 $s[i]=s[|s|-i+1]$ ,因此 $s[|s|-i+1]=s[|s|-|t|+i]$ ,所以 $t$ 是回文串。 证明: 对于 $1 \le i \le |t|$ ,由 $s$ 和 $t$ 为回文串,因此有 $s[i]=s[|s|-i+1]=s[|s|-|t|+i]$ ,所以 $t$ 是 $s$ 的 border。 对于 $1 \le i \le |t|$ ,由 $t$ 是 $s$ 的 border,有 $s[i]=s[|s|-|t|+i]$ ,由 $s$ 是回文串,有 $s[i]=s[|s|-i+1]$ ,因此 $s[|s|-i+1]=s[|s|-|t|+i]$ ,所以 $t$ 是回文串。 下图中,相同颜色的位置表示字符对应相同。 Loading @@ -191,11 +191,11 @@ border:若 $0 \le r < |s|$ , $pre(s,r)=suf(s,r)$ ,就称 $pre(s,r)$ 是 $s 引理 $2$ : $t$ 是回文串 $s$ 的 border ( $|s|\le 2|t|$ ), $s$ 是回文串当且仅当 $t$ 是回文串。 > 证明: > > 若 $s$ 是回文串,由引理 $1$ , $t$ 也是回文串。 > > 若 $t$ 是回文串,由 $t$ 是 $s$ 的 border,因此 $\forall 1 \le i \le |t|, s[i]=s[|s|-|t|+i]=s[|s|-i+1]$ ,因为 $|s| \le 2|t|$ ,所以 $s$ 也是回文串。 证明: 若 $s$ 是回文串,由引理 $1$ , $t$ 也是回文串。 若 $t$ 是回文串,由 $t$ 是 $s$ 的 border,因此 $\forall 1 \le i \le |t|, s[i]=s[|s|-|t|+i]=s[|s|-i+1]$ ,因为 $|s| \le 2|t|$ ,所以 $s$ 也是回文串。 引理 $3$ : $t$ 是字符串 $s$ 的 border,则 $|s|-|t|$ 是 $s$ 的周期, $|s|-|t|$ 为 $s$ 的最小周期,当且仅当 $t$ 是 $s$ 的最长回文真后缀。 Loading @@ -209,23 +209,23 @@ border:若 $0 \le r < |s|$ , $pre(s,r)=suf(s,r)$ ,就称 $pre(s,r)$ 是 $s  > 证明: > > 1. 由引理 $3$ 的推论, $|u|=|x|-|y|$ 是 $x$ 的最小周期, $|v|=|y|-|z|$ 是 $y$ 的最小周期。考虑反证法,假设 $|u| < |v|$ ,因为 $y$ 是 $x$ 的后缀,所以 $u$ 既是 $x$ 的周期,也是 $y$ 的周期,而 $|v|$ 是 $y$ 的最小周期,矛盾。所以 $|u| \ge |v|$ 。 > > 2. 因为 $y$ 是 $x$ 的 border,所以 $v$ 是 $x$ 的前缀,设字符串 $w$ ,满足 $x=vw$ (如下图所示),其中 $z$ 是 $w$ 的 border。考虑反证法,假设 $|u| \le |z|$ ,那么 $|zu| \le 2|z|$ ,所以由引理 $2$ , $w$ 是回文串,由引理 $1$ , $w$ 是 $x$ 的 border,又因为 $|u| > |v|$ ,所以 $|w| > |y|$ ,矛盾。所以 $|u| > |z|$ 。 > > 3. $u,v$ 都是 $x$ 的前缀, $|u|=|v|$ ,所以 $u=v$ 。 > >  证明: 1. 由引理 $3$ 的推论, $|u|=|x|-|y|$ 是 $x$ 的最小周期, $|v|=|y|-|z|$ 是 $y$ 的最小周期。考虑反证法,假设 $|u| < |v|$ ,因为 $y$ 是 $x$ 的后缀,所以 $u$ 既是 $x$ 的周期,也是 $y$ 的周期,而 $|v|$ 是 $y$ 的最小周期,矛盾。所以 $|u| \ge |v|$ 。 2. 因为 $y$ 是 $x$ 的 border,所以 $v$ 是 $x$ 的前缀,设字符串 $w$ ,满足 $x=vw$ (如下图所示),其中 $z$ 是 $w$ 的 border。考虑反证法,假设 $|u| \le |z|$ ,那么 $|zu| \le 2|z|$ ,所以由引理 $2$ , $w$ 是回文串,由引理 $1$ , $w$ 是 $x$ 的 border,又因为 $|u| > |v|$ ,所以 $|w| > |y|$ ,矛盾。所以 $|u| > |z|$ 。 3. $u,v$ 都是 $x$ 的前缀, $|u|=|v|$ ,所以 $u=v$ 。  推论: $s$ 的所有回文后缀按照长度排序后,可以划分成 $\log |s|$ 段等差数列。 > 证明: > > 设 $s$ 的所有回文后缀长度从小到大排序为 $l_1,l_2,\dots,l_k$ 。对于任意 $2 \le i \le k-1$ ,若 $l_{i}-l_{i-1}=l_{i+1}-l_{i}$ ,则 $l_{i-1},l_{i},l_{i+1}$ 构成一个等差数列。否则 $l_{i}-l_{i-1}\neq l_{i+1}-l_{i}$ ,由引理 $4$ ,有 $l_{i+1}-l_{i}>l_{i}-l_{i-1}$ ,且 $l_{i+1}-l_{i}>l_{i-1}$ , $l_{i+1}>2l_{i-1}$ 。因此,若相邻两对回文后缀的长度之差发生变化,那么这个最大长度一定会相对于最小长度翻一倍。显然,长度翻倍最多只会发生 $O(\log |s|)$ 次,也就是 $s$ 的回文后缀长度可以划分成 $\log |s|$ 段等差数列。 > > 该推论也可以通过使用弱周期引理,对 $s$ 的最长回文后缀的所有 border 按照长度 $x$ 分类, $x \in [2^0,2^1),[2^1,2^2),\dots,[2^k,n)$ ,考虑这 $\log |s|$ 组内每组的最长 border 进行证明。详细证明可以参考金策的《字符串算法选讲》和陈孙立的 2019 年 IOI 国家候选队论文《子串周期查询问题的相关算法及其应用》。 证明: 设 $s$ 的所有回文后缀长度从小到大排序为 $l_1,l_2,\dots,l_k$ 。对于任意 $2 \le i \le k-1$ ,若 $l_{i}-l_{i-1}=l_{i+1}-l_{i}$ ,则 $l_{i-1},l_{i},l_{i+1}$ 构成一个等差数列。否则 $l_{i}-l_{i-1}\neq l_{i+1}-l_{i}$ ,由引理 $4$ ,有 $l_{i+1}-l_{i}>l_{i}-l_{i-1}$ ,且 $l_{i+1}-l_{i}>l_{i-1}$ , $l_{i+1}>2l_{i-1}$ 。因此,若相邻两对回文后缀的长度之差发生变化,那么这个最大长度一定会相对于最小长度翻一倍。显然,长度翻倍最多只会发生 $O(\log |s|)$ 次,也就是 $s$ 的回文后缀长度可以划分成 $\log |s|$ 段等差数列。 该推论也可以通过使用弱周期引理,对 $s$ 的最长回文后缀的所有 border 按照长度 $x$ 分类, $x \in [2^0,2^1),[2^1,2^2),\dots,[2^k,n)$ ,考虑这 $\log |s|$ 组内每组的最长 border 进行证明。详细证明可以参考金策的《字符串算法选讲》和陈孙立的 2019 年 IOI 国家候选队论文《子串周期查询问题的相关算法及其应用》。 有了这个结论后,我们现在可以考虑如何优化 $dp$ 的转移。 Loading @@ -241,11 +241,11 @@ border:若 $0 \le r < |s|$ , $pre(s,r)=suf(s,r)$ ,就称 $pre(s,r)$ 是 $s 最后,上述做法的正确性依赖于:如果 $x$ 和 $fail[x]$ 属于同一个等差数列,那么 $fail[x]$ 上一次出现位置是 $i-diff[x]$ 。 > 证明: > > 根据引理 $1$ , $fail[x]$ 是 $x$ 的 border,因此其在 $i-diff[x]$ 处出现。 > > 假设 $fail[x]$ 在 $(i-diff[x],i)$ 中的 $j$ 位置出现。由于 $x$ 和 $fail[x]$ 属于同一个等差数列,因此 $2|fail[x]| \ge x$ 。多余的 $fail[x]$ 和 $i-diff[x]$ 处的 $fail[x]$ 有交集,记交集为 $w$ ,设串 $u$ 满足 $uw=fail[x]$ 。用类似引理 $1$ 的方式可以证明, $w$ 是回文串,而 $x$ 的前缀 $s[i-len[x]+1..j]=uwu$ 也是回文串,这与 $fail[x]$ 是 $x$ 的最长回文前缀(后缀)矛盾。 证明: 根据引理 $1$ , $fail[x]$ 是 $x$ 的 border,因此其在 $i-diff[x]$ 处出现。 假设 $fail[x]$ 在 $(i-diff[x],i)$ 中的 $j$ 位置出现。由于 $x$ 和 $fail[x]$ 属于同一个等差数列,因此 $2|fail[x]| \ge x$ 。多余的 $fail[x]$ 和 $i-diff[x]$ 处的 $fail[x]$ 有交集,记交集为 $w$ ,设串 $u$ 满足 $uw=fail[x]$ 。用类似引理 $1$ 的方式可以证明, $w$ 是回文串,而 $x$ 的前缀 $s[i-len[x]+1..j]=uwu$ 也是回文串,这与 $fail[x]$ 是 $x$ 的最长回文前缀(后缀)矛盾。 例题: [Codeforces 932G Palindrome Partition](https://codeforces.com/problemset/problem/932/G) Loading