题解:CF1840E Character Blocking
zhangmuning1016 · · 题解
题意
有三种操作:
- 锁定机制:让位置
pos 在t 秒内被忽略。 - 交换操作:交换当前未被锁定的字符。
- 比较操作:遍历所有位置,比较当前未被锁定的字符是否相等。
思路
- 记录锁定结束时间。
- 维护实际字符。
- 遍历,跳过锁定的字符,比较剩余字符即可。
代码
#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; }