Vijos1382 尋找主人

2021-08-14 16:02:21 字數 1518 閱讀 4384

new blog!

標籤:最小表示法

題目傳送門 背景

有一天,袁☆同學綿了一條價值連城寶石項鍊,但是,乙個嚴重的問題是,他竟然忘記了項鍊的主人是誰!在得知此事後,很多人向☆同學發來了很多郵件,都說項鍊是自己的,要求他歸還(顯然其中最多只有乙個人說了真話)。 ☆同學要求每個人都寫了一段關於自己項鍊的描述: 項鍊上的寶石用數字0至9來標示。乙個對於項鍊的表示就是從項鍊的某個寶石開始,順指標繞一圈,沿途記下經過的寶石,比如如下項鍊: 1-2-3-4   它的可能的四種表示是0123、1230、2301、3012。

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

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

格式 輸入格式

輸入檔案只有兩行,每行乙個由0至9組成的字串,描述乙個項鍊的表示(保證項鍊的長度是相等的)。 設l = 項鍊長度, 對於50%的資料l <= 100000; 對於100%的資料l <= 1000000。

輸出格式

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

樣例1

樣例輸入1

2234342423

2423223434

樣例輸出1

yes

2234342423

限制每個測試點1秒.

**noi2008模擬 郭華陽

兩個字串進行最小表示法

然後判斷是否相同

我竟然忘了將陣列下標取模orz

#include

#include

#include

#include

#include

#include

#define rep(i,a,b) for(int i=a;i<=b;i++)

#define dep(i,a,b) for(int i=a;i>=b;i--)

#define ll long long

#define mem(x,num) memset(x,num,sizeof x)

#define reg(x) for(int i=last[x];i;i=e[i].next)

using

namespace

std;

inline ll read()

while(ch>='0'&&ch<='9')

return x*f;

}const

int maxn=3e6+6;

char st1[maxn],st2[maxn];

int len;

int find(char *st)

return min(i,j);

}int main()

puts("yes");

for(int i=0;iprintf("%c",st1[(pos1+i)%len]);

return

0;}

vijos1382尋找主人

題目大意 給出兩個串 長度 1e6 問是否同構,如果同構輸出最小表示。題解 這是最小表示法模板題。在這裡好好講一下最小表示法。首先有乙個最暴力的方法 把所有表示搞出來排序。時間複雜度o n 2logn 然後可以發現,比較兩個字串時都是從第一位向後比。偽 char s n 1 int mex retu...

尋找主元素

如果乙個陣列a 1.n 中超過半數的元素都相同時,該陣列被稱為含有主元素。演算法思想 利用快速排序的思想,如果這個陣列存在主元素,則它一定為排序後的中位數。但問題是,我們要設計o n 演算法,我們知道,排序的最優時間複雜度是o nlogn 所以我們需要借助其他的方法來完成這個問題。我們可以想到快速排...

vijos1909 noip2014 尋找道路

在有向圖 g 中,每條邊的長度均為 1,現給定起點和終點,請你在圖中找一條從起點到 終點的路徑,該路徑滿足以下條件 路徑上的所有點的出邊所指向的點都直接或間接與終點連通。在滿足條件 1 的情況下使路徑最短。注意 圖 g 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。第一行...