題解 HDU6675 度度熊與排列 思維

2021-09-26 08:00:08 字數 1940 閱讀 4371

度熊有乙個機器,這個機器有乙個 1∼m 的排列 p[1…m] 當作引數,若丟進乙個長度為 m 的字串,此機器會將此字串重新排列後再輸出,重新排列的方式為:原本第 i 個位置的字元會變到第 p[i] 個位置。

舉例來說,當 m=3,p[1]=3,p[2]=1,p[3]=2,那麼丟 「abc」 進入這個機器後,機器會輸出"bca";若丟進的是 「ded」,那麼機器會輸出 「edd」。

某天,度熊不小心忘記這個機器的引數了,只記得引數的長度是 m,於是他丟了 n 長度為 m 的字串進去,並記錄下對於每個字串機器的輸出結果,請你根據這些結果,幫度熊找回這個機器的引數。若有多組引數都滿足度熊的記錄,請輸出字典序最小的排列作為引數。若並不存在任何引數滿足度熊的記錄,請輸出 −1。

注:對於兩個相異的排列a: a[1…m] 和 b[1…m],我們稱 a 比 b 小當且僅當 存在乙個 i,滿足對於所有小於 i 的 j 都有 aj=bj 且 ai有多組詢問,第一行包含乙個正整數 t 代表有幾組詢問。

每組詢問的第一行包含兩個正整數 n,m,分別代表度熊丟進機器的字串數目以及引數的長度。接下來還有 2×n 行,每行有乙個長度為 m 的字串,當中的第 2×i−1 行的字串代表度熊丟進去機器的第 i 個字串,而第 2×i 行的字串代表機器對於第 i 個字串的輸出結果。

對於每乙個詢問,輸出一行,若不存在任何引數滿足度熊的記錄,這行只包含乙個整數 −1。否則這行包含乙個排列,代表此機器所有可能的引數中字典序最小的那個。

sample input

41 3

abcbca

2 4aaab

baaa

cdcc

cccd

3 3aaa

aaabbb

bbbccc

ccc1 1az

sample output

3 1 2

2 4 3 1

1 2 3

-1note

第一組詢問中, p[1

]=3,

p[2]

=1,p

[3]=

2p[1]=3,p[2]=1,p[3]=2

p[1]=3

,p[2

]=1,

p[3]

=2是唯一的機器可能的引數。

第二組詢問中, p=[

2,4,

3,1]

p=[2,4,3,1]

p=[2,4

,3,1

] 和 p=[

3,4,

2,1]

p=[3,4,2,1]

p=[3,4

,2,1

] 都是機器可能的引數,不過 [2,

4,3,

1]

[2,4,3,1]

[2,4,3

,1] 的字典序比 [3,

4,2,

1]

[3,4,2,1]

[3,4,2

,1] 還小,故必須輸出 2,4,3,1。

題解:列舉前輸入和輸出的第乙個字串, 所有的匹配方案, 然後去放到其他字串中check一下

#include

using

namespace std;

int t, n, m;

string str1[30]

, str2[30]

;int p[60]

, vis[60]

;int

check()

}}return1;

}int

main()

for(

int i =

0; i < m; i++

)else}}

if(f)

}for

(int i =

0; i < m; i++

)end:

continue;}

return0;

}

hdu 6080 度度熊保護村莊

嘩啦啦村襲擊了喵哈哈村!度度熊為了拯救喵哈哈村,帶著自己的夥伴去救援喵哈哈村去了!度度熊與夥伴們很快的就過來佔據了喵哈哈村的各個軍事要地,牢牢的守住了喵哈哈村。但是度度熊發現,這是一場曠日持久的戰鬥,所以度度熊決定要以逸待勞,儲存盡量多的體力,去迎戰嘩啦啦村的戰士。於是度度熊決定派盡量多的人去休息,...

HDU 6375 度度熊學佇列

danshlem description 度度熊正在學習雙端佇列,他對其翻轉和合併產生了很大的興趣。初始時有 n 個空的雙端佇列 編號為 1 到 n 你要支援度度熊的 q 次操作。1 u w val 在編號為 u 的佇列裡加入乙個權值為 val 的元素。w 0 表示加在最前面,w 1 表示加在最後面...

hdu6376 度度熊剪紙條

度度熊有一張紙條和一把剪刀。紙條上依次寫著 n 個數字,數字只可能是 0 或者 1。度度熊想在紙條上剪 k 刀 每一刀只能剪在數字和數字之間 這樣就形成了 k 1 段。他再把這 k 1 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊好奇的是,字首 1 的數量最多能是多少。...