这里会显示出您选择的修订版和当前版本之间的差别。
|
2020-2021:teams:i_dont_know_png:potassium:lyndon [2020/05/19 15:50] potassium 创建 |
2020-2021:teams:i_dont_know_png:potassium:lyndon [2020/05/22 20:12] (当前版本) potassium fix typos |
||
|---|---|---|---|
| 行 9: | 行 9: | ||
| 又由于单个字符是一个 Lyndon 串,可依靠这种思想进行合并。 | 又由于单个字符是一个 Lyndon 串,可依靠这种思想进行合并。 | ||
| - | Lyndon 分解:将字符串 $s$ 分成 $s=s_1s_2s_3..s_m$,使得每个 $s_i$ 都是 Lyndon 串,且 $\forall 1\le i<n:s_i\ge s_{i+1}$。 | + | Lyndon 分解:将字符串 $s$ 分成 $s=s_1s_2s_3\ldots s_m$,使得每个 $s_i$ 都是 Lyndon 串,且 $\forall 1\le i<n:s_i\ge s_{i+1}$。 |
| ===== 算法 ===== | ===== 算法 ===== | ||
| 行 19: | 行 19: | ||
| Duval 算法过程: | Duval 算法过程: | ||
| - | 维护三个变量 $i,j,k$ , $[0..i-1]$ 为一些已经确定的 Lyndon 串, $[i..k-1]$ 为 Lyndon 串 $t$ 进行多次重复后加一个 $t$ 的真前缀 $v$。当前处理的字符位置为 $k$ , $j=k-len(t)$。分类讨论: | + | 维护三个变量 $i,j,k$ , $[0\ldots i-1]$ 为一些已经确定的 Lyndon 串, $[i\ldots k-1]$ 为 Lyndon 串 $t$ 进行多次重复后加一个 $t$ 的真前缀 $v$。当前处理的字符位置为 $k$ , $j=k-len(t)$。分类讨论: |
| * $s[k]=s[j]$ 。直接 $k=k+1,j=j+1$。 | * $s[k]=s[j]$ 。直接 $k=k+1,j=j+1$。 | ||
| - | * $s[k] > s[j]$。此时 $s[i..k]$ 为 Lyndon 串,合并一下, $k=k+1,j=i$ 。 | + | * $s[k] > s[j]$。此时 $s[i\ldots k]$ 为 Lyndon 串,合并一下, $k=k+1,j=i$ 。 |
| * $s[k]<s[j]$ 。此时每一个 $t$ 都为 Lyndon 串,将 $i$ 前移到 $v$ 的开头。 | * $s[k]<s[j]$ 。此时每一个 $t$ 都为 Lyndon 串,将 $i$ 前移到 $v$ 的开头。 | ||
| 行 76: | 行 76: | ||
| * 题解:对于每次询问 $(l,k)$ ,首先算出 $r=nxt[l]$ ,进行分类讨论: | * 题解:对于每次询问 $(l,k)$ ,首先算出 $r=nxt[l]$ ,进行分类讨论: | ||
| * $lcp(suf(l),suf(r))=0$ :答案必为 $[l,r-1]$ 。 | * $lcp(suf(l),suf(r))=0$ :答案必为 $[l,r-1]$ 。 | ||
| - | * $lcp(suf(l),suf(r))>0$ ,设 $len = r-l,tot=len\cdot\left\lfloor\dfrac{lcp+len}{len}\right\rfloor$ ,即 $s[l..r-1]$ 重复出现的长度。 | + | * $lcp(suf(l),suf(r))>0$ ,设 $len = r-l,tot=len\cdot\left\lfloor\dfrac{lcp+len}{len}\right\rfloor$ ,即 $s[l\cdots r-1]$ 重复出现的长度。 |
| * $tot\bmod k=0$ :设 $remain=n-(l+tot\cdot len)$ - $remain=0$ :此时可均分,答案为 $[l,l+\left\lfloor\dfrac {tot}{k}\right\rfloor-1]$ - $remain \ne0$ :此时将最后一段连接到结尾,答案为 $[l+tot-\left\lfloor\dfrac{tot}{k}\right\rfloor,n]$ | * $tot\bmod k=0$ :设 $remain=n-(l+tot\cdot len)$ - $remain=0$ :此时可均分,答案为 $[l,l+\left\lfloor\dfrac {tot}{k}\right\rfloor-1]$ - $remain \ne0$ :此时将最后一段连接到结尾,答案为 $[l+tot-\left\lfloor\dfrac{tot}{k}\right\rfloor,n]$ | ||
| * $tot\bmod k\ne 0$ :此时 $remain$ 段比循环段小,故答案为从 $l$ 开始的一段 $[l,l+len\cdot\left\lfloor\dfrac{tot/len}{k}\right\rfloor-1]$ | * $tot\bmod k\ne 0$ :此时 $remain$ 段比循环段小,故答案为从 $l$ 开始的一段 $[l,l+len\cdot\left\lfloor\dfrac{tot/len}{k}\right\rfloor-1]$ | ||