B - New Place 二分
题目大意
给你长度为 \(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';

浙公网安备 33010602011771号