题解:CF1840E Character Blocking

· · 题解

题意

有三种操作:

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

    思路

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

      代码

      #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;
      }