Loading

B - New Place 二分

https://atcoder.jp/contests/arc154/tasks/arc154_b

题目大意

给你长度为 \(N\) 的字符串 \(S\)\(T\),它们由小写英文字母组成。
您可以重复下面的操作任意多次。
擦除 \(S\) 的第一个字符,并在 \(S\) 的任意位置插入相同的字符。判断是否有可能使 \(S\) 等于 \(T\),如果有可能,请找出所需的最少操作次数。

1000分左右的题目。首先判断无解是很好做的,直接看两个排序完的串相不相同即可,而且很容易就可以分析出来除了不相同的情况,其他情况一定有解。答案是可以二分出来的,假设我们用了 \(k\) 次操作后匹配了,那么我们只能操作前 \(k\) 个数,这时候 \(S_{k+1\to n}\) 一定是 \(T\) 的子序列才可能做到,所以二分里面判断一下就可以了。

int n; cin >> n;
string s, t; cin >> s >> t;
string ss = s, tt = t;
sort(all(ss)); sort(all(tt));
if (ss != tt) {
	cout << -1 << '\n';
	return 0;
}
auto well = [&](int x) {
	rep(i,0,n) if (t[i] == s[x]) ++x;
	return x == n;
};
int l = 0, r = n;
while (l < r) {
	int mid = (l + r) >> 1;
	if (well(mid)) r = mid;
	else l = mid + 1;
}
cout << l << '\n';
posted @ 2024-03-12 17:42  KakaDBL  阅读(11)  评论(0)    收藏  举报