字串的最小表示是該字串的所有迴圈同構串中字典序最小的那個串。
根據其迴圈同構結構,採用破環成鏈,即:倍增的形式來表示。
引理:若兩個迴圈同構串\(s[i+k],則對於任意的\(i\in[i,i+k]\),均不可能是最優解。
證明:\(s[i+k],所以對任意的\(i'\in[i,i+k]\),有串\(s[j'+p],其中\(i'+p=j'+p=i+k=j+k\),證畢。
**如下
#include using namespace std;
const int maxn=1e6+10;
char s[maxn];
int n;
void read_and_parse()
void solve()else
} printf("%d\n",min(i,j));
}int main()
最小表示法 模板
最小表示法就是對於乙個迴圈字串,其字典序最小的狀態 顯然任意乙個迴圈串的最小表示法是唯一的,那麼可以同過比較兩個迴圈串的最小表示法來判斷它們是否相同 對於樸素演算法 初始化 i 0,j 1,k 0 若 s i s j j 若 s i s j i j,j 若 s i s j 則 k 直至 s i k ...
最大 最小表示法模板
用i 0,j 1,k 0,表示從i開始k長度和從j開始k長度的字串相同 i,j表示當前判斷的位置 當我們str i str j 時,根據上面k的定義,需要進行k 1操作 當str i str j 時,i位置比j位置上字典序要大,固不能使用i作為開頭,又因為i開頭和j開頭的有k個相同的字元,固執行 i...
最小表示法
最小表示法就是找出字串s的的迴圈同構串中字典序最小的乙個。那麼什麼是迴圈同構串呢。是 設s bcad 且s 是s 的迴圈同構的串。s 可以是 bcad 或者cadb,adbc,dbca 即在字串s中從i 0開始,從i迴圈到字串末尾,再從頭迴圈到i,所形成的字元就是s迴圈同構串。因為這樣的同構串不止乙...