158 項鍊 字串的最小表示

2021-10-08 14:31:56 字數 1300 閱讀 8078

有一天,達達撿了一條價值連城的寶石項鍊,但是,乙個嚴重的問題是,他並不知道項鍊的主人是誰!

在得知此事後,很多人向達達發來了很多郵件,都說項鍊是自己的,要求他歸還(顯然其中最多只有乙個人說了真話)。

達達要求每個人都寫了一段關於自己項鍊的描述: 項鍊上的寶石用數字0至9來標示。

乙個對於項鍊的表示就是從項鍊的某個寶石開始,順指標繞一圈,沿途記下經過的寶石,比如項鍊: 0-1-2-3 ,它的可能的四種表示是0123、1230、2301、3012。

達達現在心急如焚,於是他找到了你,希望你能夠編寫乙個程式,判斷兩個給定的描述是否代表同乙個項鍊(注意,項鍊是不會翻轉的)。

也就是說給定兩個項鍊的表示,判斷他們是否可能是一條項鍊。

輸入格式

輸入檔案只有兩行,每行乙個由字元0至9構成的字串,描述乙個項鍊的表示(保證項鍊的長度是相等的)。

輸出格式

如果兩個對項鍊的描述不可能代表同乙個項鍊,那麼輸出』no』,否則的話,第一行輸出乙個』yes』,第二行輸出該項鍊的字典序最小的表示。

資料範圍

設項鍊的長度為l,1≤l≤1000000<?xml:namespace prefix = "[default] " ns = "" />1≤l≤1000000

輸入樣例:

2234342423

2423223434

輸出樣例:
yes

2234342423

最小表示法:

1.初始化 i= 1, j = 2.

2.通過直接向後掃瞄,比較s[i],s[j]兩個同構字串的大小。

(1)如果掃瞄了n個字元任然相等,說明字串s是由乙個字元構成。

(2)如果在i+k與j+k處發現不相等:

若s[i+k] > s[j+k],則鄰 i = i + k + 1 ,若 i = j ,則 i++;

若s[j+k] > s[i+k],則鄰 j = j + k + 1 ,若 i = j ,則 j++;

3.若 j > n,則s[i ~(i + n)]是最小表示,若i > n,則s[j~(j+n)]是最小表示;否則重複2

#include #include #include using namespace std;

int main()

else

}int ans = min(i, j);

for(int i = ans; i < ans + n; ++ i) cout << s[i];

}else puts("no");

}

158 項鍊 字串的最小表示

有一天,達達撿了一條價值連城的寶石項鍊,但是,乙個嚴重的問題是,他並不知道項鍊的主人是誰!在得知此事後,很多人向達達發來了很多郵件,都說項鍊是自己的,要求他歸還 顯然其中最多只有乙個人說了真話 達達要求每個人都寫了一段關於自己項鍊的描述 項鍊上的寶石用數字0至9來標示。乙個對於項鍊的表示就是從項鍊的...

AcWing 158 項鍊 字串最小表示法

有一天,達達撿了一條價值連城的寶石項鍊,但是,乙個嚴重的問題是,他並不知道項鍊的主人是誰!在得知此事後,很多人向達達發來了很多郵件,都說項鍊是自己的,要求他歸還 顯然其中最多只有乙個人說了真話 達達要求每個人都寫了一段關於自己項鍊的描述 項鍊上的寶石用數字0至9來標示。乙個對於項鍊的表示就是從項鍊的...

acwing 158 項鍊 字串的最小表示 模板

兩個字串,判斷它們是不是同構的,如果同構,輸出最小表示。最小表示法模板題。pragma warning disable 4996 include include include include include include include includeusing namespace std ty...