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 @   sz_jinzikai  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示