F-Operate-K

F - Operate K

类似于编辑距离,但是数据范围5e5,n*m肯定爆
由于k <= 20 ,如果相差超过k,肯定不可行,所以转移约束
从max(1LL,i-k)到min(m,i+k)

整个转移是一个梯形

如果不判断,当长度max(1LL,i-k) > m,会直接break 时会导致前面的数据没有更新,会出现问题qwq

if (abs(n-m) > k) {
	cout << "No";
	return 0;
}	
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int ll
const int N = 5e5 + 10;
const int inf = 1e9;
vector<vector<int>> dp(3,vector<int>(N,inf));

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int k;
	cin >> k;
	string t, s;
	cin >> s >> t;

	int m = s.size(), n = t.size();
	if (abs(n-m) > k) {
		cout << "No";
		return 0;
	}	
	s = '0' + s;
	t = '1' + t;
	
	for (int i = 0; i <= min(m,k); i++) {
		dp[1][i] = i;
	}
	
	for (int i = 1; i <= n; i++) {
		dp[2][0] = i;
//		if (i - k - 1 >= 1) {
//			dp[2][i - k - 1] = inf;
//		}
		for (int j = max(1LL,i-k); j <= min(m,i+k); j++) {
			dp[2][j] = min({dp[1][j-1] + (t[i] != s[j]), dp[2][j-1] + 1, dp[1][j] + 1});
		}
		swap(dp[1],dp[2]);
	}
	
	if (dp[1][m] <= k) {
		cout << "Yes";
	} else {
		cout << "No";
	}
	
	return 0; 
}
github