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;
}
posted @ 2021-12-15 22:17  Eason_AC  阅读(30)  评论(0)    收藏  举报