有一天,達達撿了一條價值連城的寶石項鍊,但是,乙個嚴重的問題是,他並不知道項鍊的主人是誰!
在得知此事後,很多人向達達發來了很多郵件,都說項鍊是自己的,要求他歸還(顯然其中最多只有乙個人說了真話)。
達達要求每個人都寫了一段關於自己項鍊的描述: 項鍊上的寶石用數字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是由乙個字元構成。3.若 j > n,則s[i ~(i + n)]是最小表示,若i > n,則s[j~(j+n)]是最小表示;否則重複2(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++;
#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...