HDU 4545魔法串最長公共子串行

2021-07-04 08:20:41 字數 1561 閱讀 6598

hdu - 4545

魔法串time limit:1000ms

memory limit:32768kb

64bit io format:%i64d & %i64u

submit

status

description

小明和他的好朋友小西在玩乙個新的遊戲,由小西給出乙個由小寫字母構成的字串,小明給出另乙個比小西更長的字串,也由小寫字母組成,如果能通過魔法轉換使小明的串和小西的變成同乙個,那麼他們兩個人都會很開心。這裡魔法指的是小明的串可以任意刪掉某個字元,或者把某些字元對照字元變化表變化。如: 

小西的串是 abba; 

小明的串是 addba; 

字元變化表 d b (表示d能轉換成b)。 

那麼小明可以通過刪掉第乙個d,然後將第二個d轉換成b將串變成abba。 

現在請你幫忙判斷:他們能不能通過魔法轉換使兩個人的串變成一樣呢?

input

首先輸入t,表示總共有t組測試資料(t <= 40)。 

接下來共t組資料,每組資料第一行輸入小西的字串,第二行輸入小明的字串(資料保證字串長度不超過1000,小明的串的長度大於等於小西的,且所有字元均為小寫字母)。接著輸入字母表,先輸入m,表示有m個字元變換方式(m< = 100),接著m行每行輸入兩個小寫字母,表示前乙個可以變為後乙個(但並不代表後乙個能變成前乙個)。

output

對於每組資料,先輸出case數。 

每組資料佔一行,具體輸出格式參見樣例。

sample input

2

abba

addba

1d badd

0

sample output

這裡將題目看懂就可以裝換為最長公共子串行

**中用的是個滾動陣列,因為遞推只需要他相鄰一層的資料即可

/*

author: 2486

memory: 1468 kb time: 46 ms

language: g++ result: accepted

*/#include #include #include #include #include using namespace std;

const int maxn = 1000 + 5;

char str1[maxn], str2[maxn], op1[10], op2[10];

int dp[2][maxn];

int t, m;

vectorg[30];

bool judge(char a, char b)

return false;

}bool lca()

}if(max == t1) return true;

return false;

}int main()

printf("case #%d: ", case ++);

}return 0;

}

hdu 4545 西山居一 魔法串

題目 這個題目剛開始沒有做出來 很糾結哦 做錯了 後面參考了一下別人 寫出來的 發現很簡單哦 只是我當時太笨了 呵呵 要注意乙個地方 就是第一次輸入的時候不要while cin n 否則會出錯哦 具體看 include include includeusing namespace std char ...

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...