mbp送去維修的第二天,想他。
給定乙個字串s[1~n],如果我們不斷把它的最後乙個字元放到開頭,會得到n個字串,稱這n個字串是迴圈同構的。這些字串中字典序最小的乙個,稱為字串s的最小表示法。
例如s=「abca」,則它的4個迴圈同構字串為「abca」,「aabc」,「caab」,「bcaa」。 s的最小表示為"aabc"。
這裡討論的是如何在線性時間
內求出字串的最小表示。
演算法:初始化i=1, j=2 ; 將長度為n的字串s複製乙份接在它的結尾,得到字串ss , ss中以i開頭,長度為n的串記為b[i]。
通過直接向後掃瞄的方法,比較b[i]與b[j]兩個迴圈同構串。
若i > n,b[j]為最小表示;若j > n b[ji]為最小表示;否則重複第2布。
int n =
strlen
(s+1);
//複製乙份接在後面
for(
int i=
1; i<=n; i++
) s[n+i]
= s[i]
;int i =
1, j =
2, k;
while
(i <= n && j <= n)
else
} ans =
min(i,j)
;// b[ans]為最小表示
字串最小表示法
最小表示法的定義 給定乙個字串,不斷地把最後乙個元素移到最前面,可得有n個這樣的字串 稱這n個字串是迴圈同構的 那麼最小表示就是這n個裡面字典序最小的乙個 怎麼求最小表示 wrong 最樸素的方法,把每乙個這樣的字串求出來,然後一一比較,找到字典序最小的迴圈同構串 然後資料範圍變大肯定會超時 那麼正...
字串最小表示法
乙個長度為n的首尾相連的字串可以有n種表示法,例如串 abcd 還可以表示bcda,cdab,dabc當我們面臨這樣的字串的時候,我們很難統計相同字串的個數。因此我們引入一種字串的最小表示法來使這些串變得相同。字串的最小表示法是將原來的字串旋轉得到的字典序最小的串 設字串st的長度為len,我們可以...
字串的最小表示法
定義 給定乙個字串 s 1 n 如果我們不斷把他的最後乙個字元放到開頭,最終會得到 n 個字串,稱這 n 個字串是迴圈同構的。這些字串中字典序最小的乙個,稱為字串 s 的最小表示。例如 s abca 那麼它的 4 個迴圈同構字串為 abca aabc caab bcaa s 的最小表示為 aabc ...