1. 程式人生 > 遊戲 >《看門狗:軍團》與《刺客信條》聯動 推出新角色Darcy

《看門狗:軍團》與《刺客信條》聯動 推出新角色Darcy

oi-wiki

這是一種用於解決字串最小表示問題的方法。

定義:字串 \(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.}\)