约定:
字符串的下标从 \(0\) 开始。\(|s|\) 表示字符串 \(s\) 的长度。
对于字符串 \(s\),记其每一个字符分别为 \(s_0, s_1, \cdots, s_{|s|-1}\)。
子串 \(s_l, s_{l+1}, \cdots, s_{r-1}, s_r\) 简记为 \(s[l:r]\)。特别地,若 \(l=0\),可记作 \(s[:r]\);若 \(r=|s|-1\),可记作 \(s[l:]\)。
对于字符串 \(a, b\),\(a+b\) 表示拼接操作,即将字符串 \(b\) 拼接到字符串 \(a\) 之后,构成新的字符串。
记构成的新字符串为 \(c\),则上述拼接操作记为 \(c\gets a+b\)。
其中符号 \(x\gets y\) 表示将 \(y\) 的值赋给 \(x\)。
不论是字符还是字符串,皆不加引号。
模板题
若 \(\exist i,\ 1\leqslant i\leqslant |s|-1,\ t=s[i:]+s[:i-1]\),称 \(s\) 和 \(t\) 互为循环同构串。
我们要求的是字符串 \(s\) 的所有循环同构串中字典序最小的一个。方便起见,记 \(s\left<i\right>=s[i:]+s[:i-1]\) ,即以 \(i\) 为开始的循环同构串。
暴力比较显然不行,我们要利用循环同构串的性质。