題目描述
有一天,小y突然發現自己的計算機感染了一種病毒!還好,小y發現這種病毒很弱,只是會把文件中的所有字母替換成其它字母,但並不改變順序,也不會增加和刪除字母。
現在怎麼恢復原來的文件呢!小y很聰明,他在其他沒有感染病毒的機器上,生成了乙個由若干單詞構成的字典,字典中的單詞是按照字母順序排列的,他把這個檔案拷貝到自己的機器裡,故意讓它感染上病毒,他想利用這個字典檔案原來的有序性,找到病毒替換字母的規律,再用來恢復其它文件。
現在你的任務是:告訴你被病毒感染了的字典,要你恢復乙個字母串。
輸入
第一行為整數k(k
≤50000
)k(k≤50000)
k(k≤50
000)
,表示字典中的單詞個數。
以下k行,是被病毒感染了的字典,每行乙個單詞。
最後一行是需要你恢復的一串字母。
所有字母均為小寫。
輸出
輸出僅一行,為恢復後的一串字母。當然也有可能出現字典不完整、甚至字典是錯的情況,這時請輸出乙個0。
樣例輸入
6cebdbac
cacecd
dcaaba
baccedab
樣例輸出
abcde
範圍無思路
此題毒性巨大,請讀者做好心理準備。
要不是老師說是用拓撲排序,真看不出此題怎麼做
開始表演!!!
引入思路
由於它所給的單詞是有序的,所以我們要在單詞中找到可能存在的字母順序(某個比某個大)。
想一想,我們自己查英語字典的時候,比如(common),我們是先確定第乙個字母c
cc在字典中的位置,而接下來我們要翻第二個字母,所以我們可能先會翻到a,b
,c
…a,b,c…
a,b,c…
,我們就可以確定o肯定比a,b
,c
…a,b,c…
a,b,c…
大,後面的字母以此類推
正式開始
由於題目說了每個詞都是按字典序給出的,所以我們需要也只能比較相鄰兩個詞第乙個不相同的字母,後面就不能比較了,因為我們無法確定它們的順序(畢竟前面都不一樣,舉個例子abcde(先給出)和abcfd(後給出),這樣我們只能確定f比d大,而不能確定它們後面字母的大小關係)
有了大小關係,我們就可以建圖,然後通過拓撲把病毒的字母大小的排列方式拿出來, 同時就可以把病毒字母與真實字母連線起來(map),最後把給出的字串對映成正確字串就行了
注意0的情況
code
#include
#include
#include
#include
#include
#include
using
namespace std;
#define m 50005
map<
char
,char
>mm;
vector<
int>g[
150]
;int n, cnt;
int in[
150]
, use[
150]
;string s[m]
, sim, ans;
intmain()
}}for(
int i =
1; i <= n; i ++
)for
(int i =
1; i <= cnt; i ++
) mm[j+
'a'-1]
='a'
+i-1
;//對映
in[j]=-
1;int siz = g[j]
.size()
;for
(int k =
0; k < siz; k ++)}
for(
int i =
0; i < sim.
length()
; i ++
) ans[i]
= mm[sim[i]];
//對映
}for
(int i =
0; i < sim.
length()
; i ++
)//如果把sim該為ans它就輸不出來
cout<;//printf("%s\n",ans);也不行,不曉得為什麼
return0;
}
拓撲排序 病毒virus
問題描述 有一天,小y突然發現自己的計算機感染了一種病毒!還好,小y發現這種病毒很弱,只是會把文件中的所有字母替換成其它字母,但並不改變順序,也不會增加和刪除字母。現在怎麼恢復原來的文件呢!小y很聰明,他在其他沒有感染病毒的機器上,生成了乙個由若干單詞構成的字典,字典中的單詞是按照字母順序排列的,他...
拓撲排序 煩人的幻燈片 病毒
q 拓撲排序用於解決什麼問題?煩人的幻燈片 題目描述 李教授於今天下午做乙個非常重要的演講。不幸的是他不是乙個非常愛整潔的人,他把自己做演講要用的幻燈片隨便堆放在一起。因此,演講之前他不得不去整理這些幻燈片。做為乙個講求效率的學者,他希望盡可能簡單地完成它。情況是這樣,教授這次演講一共要用n張幻燈片...
python 拓撲排序 Python 拓撲排序
python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...