CF1968B 题解

思路

首先很显然,如果 a1aia_1\sim a_ibb 的子序列,那 a1ai1a_1\sim a_{i-1} 肯定也是 bb 的子序列,所以我们可以贪心枚举 ii,直到不满足条件的就退出循环。但也不需要对每个 ii 都单独做一遍判断,我们用变量 jj 表示 a1ai1a_1\sim a_{i-1}b1bjb_1\sim b_j 的子序列时,jj 的最小值。然后每次判断只要在上一次的基础上找到第一个 bk=ai(k>j)b_k=a_i(k>j)kk 来作为新的 jj,如果找不到就是不符合条件了,输出答案退出循环。

代码

# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int t, n, m, now;
string a, b;
int main () {
	ios::sync_with_stdio (0);
	cin.tie (0);
	cout.tie (0);
	cin >> t;
	while (t --) {
		cin >> n >> m >> a >> b;
		now = 0;
		for (int i = 0; i < n; ++ i) {
			while (now < m && b[now] != a[i])
				++ now;
			if (++ now > m) {
				cout << i << '\n';
				goto end;
			}
		}
		cout << n << '\n';
end:
		;
	}
	return 0;
}
posted @ 2024-05-03 21:49  Vitamin_B  阅读(9)  评论(0)    收藏  举报  来源