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 中可能存在重邊和自環,題目保證終點沒有出邊。請你輸出符合條件的路徑的長度。第一行...