二進制串
(bin.cpp)
【問題描述】
有N個二進制數串 B=(b , b , ..., b ),我們按以下方法建立一個矩陣M:
1 2 ..... N
矩陣M的第一行是二進制數串B;
後面的每一行都是通過把前一行循環左移而得到的。
b b ... b b
1 2 N-1 N
b b ... b b
2 3 N 1
...
b b ... b b
N-1 N N-3 N-2
b b ... b b
N 1 N-2 N-1
然後,把以行爲單位按字典順序排序得到矩陣M。
請寫一個程序,給出矩陣M的最後一列(排序以後),求第一行(也是排序以後的)。
【輸入文件】
第一行有一個正整數N,表示二進制串B的長度,第二行有N個用空格隔開的二進制數
字,表示矩陣M的最後一列。
【輸出文件】
只有一行二進制串,表示矩陣M的第一行,這N個二進制數字沒有用空格隔開。
樣例1
bin1.in
5
1 0 0 1 0
bin1.out
00011
bin2.in
8
1 1 0 1 1 0 1 0
bin2.out
00111011
【數據範圍】
對於 30%的數據,有N<=20
對於 50%的數據,有N<=550
對於 100%的數據,有0<N<=5000
這道題主要是一道找規律的題目
因它是每次左移,所以每個數字都會出現在結尾
所以它出現了幾個1,整個二進制串就有幾個1
其次同理每個數字也會出現在開頭
所以按大到小排列最大的開頭肯定是1
現在來看一下樣例,我們可以得出這樣的結論①
0xxx1
0xxx0
0xxx0
1xxx1
1xxx0
這裏的未知數都用xxx代替,但不表示xxx是相同的
因爲它是從小到大排列的,所以往左移之後就是
xxx10
xxx00
xxx00
xxx11
xxx01
這樣看起來是變了,但是實際上它的組合數不變,組合方式不變,只是排序方式變了
我們再將它排序就會變回結論①
但是我們不知道這些數字前面的數字是哪一個地方的
這裏說明一下
結論①裏最小的二進制串左移之後再排序,它肯定就變成了結論①裏的第2串
因爲它的後面4個是最小的,其他的例如2號串左移之前的後4個組成的二進制串肯定比1號組成的大
所以左移之後1就變成了2號
注意,這裏不是說1號變成2號,所以2號變成3號,3號變成4號....
是說0開頭的1號變成了0結尾的2號
那麼,1開頭的4號就變成了1結尾的1號
以此類推,排序,會發現每次都是這樣子,左移之後排序都是這個順序變化
然而要推出所有數字要n-1次,經過變化後最後一行便就是在原來的基礎上按這個方法來一遍
即0開頭的按順序到了0結尾的去了,1開頭的按順序到了1結尾的去了
如樣例
順序變化
0 1 1->2
0 0 2->3
0 0 3->5
1 1 4->1
1 0 5->4
再按照這個變化方式輸出一次
第一個輸出是1號對應的2號
第二個輸出是2號對應的3號
第三個輸出是3號對應的5號
第四個輸出是4號對應的5號
第五個輸出是5號對應的4號
最後輸出便是00011
Code: