专栏文章

题解:CF1840E Character Blocking

CF1840E题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipaf3oa
此快照首次捕获于
2025/12/03 08:47
3 个月前
此快照最后确认于
2025/12/03 08:47
3 个月前
查看原文

题意

有三种操作:
  1. 锁定机制:让位置 pospostt 秒内被忽略。
  2. 交换操作:交换当前未被锁定的字符。
  3. 比较操作:遍历所有位置,比较当前未被锁定的字符是否相等。

思路

  • 记录锁定结束时间。
  • 维护实际字符。
  • 遍历,跳过锁定的字符,比较剩余字符即可。

代码

CPP
#include<bits/stdc++.h>
using namespace std;
int main() {
	int T;//多测 
	cin >> T;
	while (T--) {
		string s1, s2;
		cin >> s1 >> s2;//输入字符串 
		int n = s1.length();//记录长度 
		int t, q;
		cin >> t >> q;
		vector<int> d(n + 1, 0); 
		vector<int> xx(n + 1), yy(n + 1);
		for (int i = 1; i <= n; ++i) {
			xx[i] = i;
			yy[i] = i;
		}
		for (int j = 1; j <= q; ++j) {
			int type;
			cin >> type;
			if (type == 1) {
				int pos;
				cin >> pos;
				d[pos] = j + t;
			} else if (type == 2) {
				int a1, a2, b1, b2;
				cin >> a1 >> a2 >> b1 >> b2;
				if (a1 == 1 && b1 == 1) {
					swap(xx[a2], xx[b2]);//进行交换 
				} else if (a1 == 1 && b1 == 2) {
					swap(xx[a2], yy[b2]);
				} else if (a1 == 2 && b1 == 1) {
					swap(yy[a2], xx[b2]);
				} else {
					swap(yy[a2], yy[b2]);
				}
			} else {
				bool flag = true;//标记 
				for (int i = 1; i <= n; ++i) {
					if (d[i] > j){
						continue;
					} 
					if (s1[xx[i] - 1] != s2[yy[i] - 1]) {
						flag = false;//不符合 
						break;//直接退出循环 
					}
				}
				cout << (flag ? "YES" : "NO") << endl;//三目运算 
			}
		}
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...