計蒜客 封印之門(floyd)

2021-08-17 20:23:10 字數 1281 閱讀 4799

封印之門

蒜頭君被暗黑軍團包圍在一座島上,所有通往近衛軍團的路都有暗黑軍團把手。幸運的是,小島上有一扇上古之神打造的封印之門,可以通往近衛軍團,傳聞至今沒有人能解除封印。

封印之門上有一串文字,只包含小寫字母,有 kk

k 種操作規則,每個規則可以把乙個字元變換成另外乙個字元。經過任意多次操作以後,最後如果能把封印之門上的文字變換成解開封印之門的文字,封印之門將會開啟。

蒜頭君戰鬥力超強,但是不擅計算,請你幫忙蒜頭君計算至少需要操作多少次才能解開封印之門。

輸入第一行乙個字串,長度不大於 1000100010

00,只包含小寫字母,表示封印之門上的文字。

輸入第二行乙個字串,只包含小寫字母,保證長度和第乙個字串相等,表示能解開封印之門的文字。

輸入第三行乙個整數 k(0≤k≤676)k(0 \le k \le 676)k(

0≤k≤

676)

。接下來 kk

k 行,每行輸出兩個空格隔開的字元 aa

a, bb

b,表示一次操作能把字元 aa

a 變換成字元 bbb。

如果蒜頭君能開啟封印之門,輸出最少的操作次數。否則輸出一行 −1-1−1

。 樣例輸入

abcd

dddd

3a b

b cc d

樣例輸出

6

從乙個字元變到另乙個字元本質上就是圖論中的連通,用鄰接矩陣存一下圖(可到達的點)

然後比較兩個串的對應字元是否可達,用floyd演算法求出最短路程,如果可達直接加上最短路程,否則不可達

也就不可能得到最終串

code:

#include #include #include using namespace std;

const int inf = 0x3f3f3f3f;

int g[30][30];

int main()

}string s1,s2;

cin >> s1 >> s2;

int k;

cin >> k;

while(k--)

for(int k = 0; k < 26; k++)}}

int sum = 0;

for(int i = 0; i < s1.size(); i++)

else

sum += g[s1[i]-'a'][s2[i]-'a'];

}cout << sum << endl;

return 0;

}

計蒜客 封印之門 簡單Floyd應用

蒜頭君被暗黑軍團包圍在一座島上,所有通往近衛軍團的路都有暗黑軍團把手。幸運的是,小島上有一扇上古之神打造的封印之門,可以通往近衛軍團,傳聞至今沒有人能解除封印。封印之門上有一串文字,只包含小寫字母,有 kkk 種操作規則,每個規則可以把乙個字元變換成另外乙個字元。經過任意多次操作以後,最後如果能把封...

封印之門 Floyd演算法應用

來自藍橋杯 計蒜客傳送門 沒什麼難度。剛剛才知道字母一共有26個,不是24個,wa了好久。include include include define inf 0x3f3f3f3f using namespace std intmain void 下面是floyd核心 for int q 1 q 2...

計蒜客 2019計蒜之道D

題意 現在給定你乙個字串 s ss 以及乙個整數 k kk,請求出 s ss的字典序最小的長度為 k kk的子串行。資料範圍 0 s 5000000 00 s 5000 000 樣例輸入 helloworld 5樣例輸出 ellld思路 假如我們先不考慮長度為k的限制我們應當怎麼做?我們以樣例為例子...