netty系列之:自定義編碼解碼器
阿新 • • 發佈:2021-08-16
這是一種用於解決字串最小表示問題的方法。
定義:字串 \(S\) 的最小表示為與 \(S\) 迴圈同構 的所有字串中字典序最小的字串。
迴圈同構串:
設 \(S =\) bcad
,且設 \(S’\) 是 \(S\) 的迴圈同構的串。那麼 \(S’\) 可以是 bcad
, cadb
, adbc
或者 dbca
即在字串 \(S\) 中從 \(i \le 0\) 開始,從 \(i\) 迴圈到字串末尾,再從頭迴圈到 \(i\) ,所形成的字元就是 \(S\) 迴圈同構串。
又因為這樣的同構串不止一個,所以我們要找出其中字典序最小的一個即為 \(S\) 的最小表示(即字串從小到大排序,其中字典序最小的一個)。
主要是對暴力演算法的 億 點優化(
核心見 oi-wiki。
code
int minbs() { int i=0,j=1,k=0;//i,j為指標, k為匹配長度 while(i<n&&j<n&&k<n) if(a[(i+k)%n]==a[(j+k)%n]) k++;//更新匹配長度 else { if(a[(i+k)%n]>a[(j+k)%n]) i+=k+1; else j+=k+1;/*根據第k位大小跳轉指標*/ if(i==j) i++;/*若跳轉後指標相同,令其中一個+1以保證匹配的字串不同*/ k=0;//把已匹配長度清0 } return min(i,j); }
\(\texttt{End.}\)