1. 程式人生 > 其它 >CF1506C Double-ended Strings 題解

CF1506C Double-ended Strings 題解

CF1506C Double-ended Strings 題解

Content

有兩個字串 \(a,b\)。我們每次操作可以將兩個字串中的一個字串的最前面一個字元或這最後面一個字元刪去(可以將某個字串通過若干次操作變為空串)。求需要多少次操作才能夠使 \(a,b\) 兩個字串是相同的。

資料範圍:\(t\) 組資料,\(1\leqslant t\leqslant 100\)\(1\leqslant |a|,|b|\leqslant 20\)

Solution

我們發現只要你能夠找到 \(a,b\) 兩個字串之間的公共部分,你就只需要去刪這公共部分之外的其它的部分就好,所以這道題目本質上講就是要我們去求 \(a,b\)最長公共子串的長度。而又因為 \(a,b\)

的長度實在是小得可憐,因此我們考慮直接列舉。

首先列舉 \(a,b\) 兩個字串中子串的起始位置,然後再列舉長度,之後用 STL 中自帶的 substr 函式去提取出兩個字串的子串,如果這兩個子串相等,就去比較先前的答案,取長度的較大值。設我們最終得到的最長公共子串為 \(s\),則答案就是 \(|a|+|b|-2\cdot|s|\)

Code

string a, b;

int main() {
	MT {
		cin >> a; int len1 = a.size(); cin >> b; int len2 = b.size();
        int ans = 0;
		F(int, i, 0, len1 - 1) F(int, j, 0, len2 - 1) F(int, k, 0, len1 - i) F(int, l, 0, len2 - j) {
			if(k != l) continue; //連長度都不一樣,這兩個子串肯定不相同,跳過。
			string s1 = a.substr(i, k), s2 = b.substr(j, l);
			if(s1 == s2) ans = max(ans, (int)s1.size());
		}
		println(len1 + len2 - ans * 2);
	}
    return 0;
}