最小表示法学习笔记

发布时间 2023-11-02 09:10:17作者: 御坂夏铃

找出与 \(S\) 循环同构的字符串中字典序最小的那一个。

记录两个指针 \(i\)\(j\)表示当前可能成为答案的最前面两个位置。初值为字符串的前两个位置 \(1\)\(2\)。每次按 \(k\) 从小到大暴力比较 \(S_{i+k}\)\(S_{j+k}\) 的大小,当遇到 \(S_{i+k}>S_{j+k}\) 时,\(i\sim i+k\) 可以直接跳过。因为以位置 \(i+p(p\leq k)\) 开头的字符串一定比以位置 \(j+p\) 开头的字符串字典序大。\(S_{j+k}>S_{i+k}\) 同理。

根据定义,如果前面那个指针不优了,那至少会跳到后面那个指针后面一个位置。这样也就不会出现两个指针相等的情况。

但当 \(k>n\) 时,这两个位置是否就是字典序最小的呢?答案是肯定的,假设 \(i<j\),因为 \(1\sim i-1\)\(i+1\sim j-1\) 都不优,而循环节长度至多也只有 \(j-i\)