最小(大)表示法講解

2021-07-10 02:17:26 字數 903 閱讀 9766

參考文章: 引子

首先有乙個字串s,我們可以對他進行操作,每次操作都可以將第乙個字元移動到最後乙個字元。我們要求解經過n次操作後,得到的字典序最小的字串是什麼。

一.樸素演算法

樸素演算法利用兩個指標i,j。初始i = 0,j = 1。i 為最小的字串的開頭位置

a.當s[i] > s[j]  時

i = j;//因為j是更小的

j++;

b.當s[i] < s[j]時

j ++;

c.當s[i] == s[j] 時

k = 0

n = strlen(s)

while(k < n)

二.最小表示法的實現

就是在樸素的基礎上進行一些更改

仍舊是設定兩個指標i = 0,j = 1.但這兩個指標都是可以作為指向最小位置的指標,而先到達n的不是最小位置。如果k到達n,意味著整個字串都相等,那麼最小位置就是0

從k = 0 開始,如果s[(i + k) %n] == s[(j + k) %n],就一直k ++

if(s[(i + k) %n] > s[(j + k) %n])

i = i + k + 1(也就是從i 到 i + k都不可能是最小的位置)

設i'屬於[i,i+k]

有s[i',i + k - 1] == s[i' + j - i,j + k - 1]而s[i + k] > s[j + k]

另一面同理。記得k清零

如果i == j,j++。錯開

**如下:

int minandmax(int x)

else

else

}if(i == j)

k = 0;

}}return min(i,j);

}

工藝(最小 大表示法)

題意 給定長度為n nn的序列,求字典序最小的長度為n nn且與原序列迴圈同構的序列 思路 利用最小表示法 也有字尾自動機以及字尾陣列的解法 暴力的比較所有的n nn個迴圈同構的串 純暴力會被卡到o n 2 o n 2 o n2 因此需要加點優化,如下 include bits stdc h def...

最小表示法

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

最小表示法

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