字串的最小表示法

2021-09-26 01:33:26 字數 789 閱讀 8486

三個變數 思路

如果 s[(i+k)%len]>s[(j+k)%len] ,也就是在比較了相同的k位之後,字串a和b不相同了。此時的a的字典序比較大,說明字串的最小表示的開始位置不是i,但是 i~ i+k的字串卻和 j~j+k的字串是相等的,所以我們把i的位置設定為 k+1 的位置,讓i重新選取開始位置和字串j比較。

如果,s[(i+k)%len]s[(i+k)%len]的時候,j才會增加。

所以當a串等於b串的時候,在此之前,a[i+1] ~ a[i+k]>a[i],而因為b==a,所以,b[j+1] ~ b[j+k] >b[0] (b[0]==a[0]) 。所以,我們選取位置的時候,沒有必要考慮 j~j+k位置的字元,我們直接將j移到k+1的位置。

用例子做說明的話,字串 13 和字串13 ,此時比較下一位 1 和 4,因為ab的前幾位均相同,我們沒有必要再讓j從下一位開始,一位一位和i=0開始的字串去比較。

注意**裡給了兩組樣例,這裡需要說明的是,字串的最小表示法表示的僅僅是,相對於傳入字串,哪個位置開始為最小字串。

設最小表示位置為 k ,對於原字串 s ,從 k 開始迴圈則 s 最小,但是對於 0#include

#include

#include

intgetmin

(char

*s,int len)

else

else

if(i==j)

k=0;

}}return i}int

main()

/*2213211

101010

*/

字串最小表示法

最小表示法的定義 給定乙個字串,不斷地把最後乙個元素移到最前面,可得有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 ...