最小表示法

2022-05-04 13:48:11 字數 689 閱讀 4576

oi wiki

找出乙個字串的最小迴圈同構,就是最小表示法。

由於我們只想要找到最小的,所以可以用打擂台的方式進行篩選。但是如果每個串都逐位比較的話,發現會被 \(aaa\cdots aab\) 這樣的資料輕鬆卡成 \(o(n^2)\)。

考慮優化,我們發現如果有兩個相同的很長的子串,複雜度就難以保證。但是其實相同的都是可以跳過的。舉個例子,你現在比較完了 \([l_1,r_1]\) 和 \([l_2,r_2]\) 這兩個區間,其中 \([l_1,r_1-1]\) 與 \([l_2,r_2-1]\) 相同,\(s_< s_\) ,那麼我們沒有必要再比較 \([l_1+1,r_1]\) 和 \([l_2+1,r_2]\) 這兩個區間,因為顯然是前者更小。所以我們可以直接把第二個指標移到 \(r_2\) 這個位置,然後繼續演算法。

這裡是大致**實現:

int i=1,j=2,k=0;

while(i<=n&&j<=n&&ka[t(j+k)]) i=i+k+1;

else j=j+k+1;

k=0;

if(i==j) i++;

}i=min(i,j);

發現 \(k\) 每次增加必然會使得 \(i,j\) 其中乙個指標增加,\(else\) 裡的語句也必然使得乙個指標增加,而指標最多增加 \(2n-1\) 次,所以這個**的均攤時間複雜度是 \(o(n)\) 的。

最小表示法

最小表示法就是找出字串s的的迴圈同構串中字典序最小的乙個。那麼什麼是迴圈同構串呢。是 設s bcad 且s 是s 的迴圈同構的串。s 可以是 bcad 或者cadb,adbc,dbca 即在字串s中從i 0開始,從i迴圈到字串末尾,再從頭迴圈到i,所形成的字元就是s迴圈同構串。因為這樣的同構串不止乙...

最小表示法

最小表示法 思想 在字串迴圈同構問題中的應用 摘自周源的ppt 前言 最小表示法 比起動態規劃 貪心等思想,在當今競賽中似乎並不是很常見。但是在解決判斷 同構 一類問題中卻起著重要的作用。本文即將討論字串中的同構問題,如何巧妙地運用最小表示法來解題呢,讓我們繼續一起思考吧。到底什麼是迴圈同構的字串呢...

最小表示法

最小表示法與kmp演算法一樣都可以解決字串匹配問題,但效率更高,短,作用更大。最小表示法就是乙個字串的最小字典序。怎麼求乙個字串的最小字典序呢?首先將這個字串擴充套件一倍 建設存在d陣列裡 然後我們用三個指標i 0,j 1,k 0,來尋找最小字典序的開頭字母,為了優於kmp,我們要做到o n i表示...