読者です 読者をやめる 読者になる 読者になる

Codeforces Round #350 Div2 E: Correct Bracket Sequence Editor

解法

愚直シミュレーション

コード

#include <bits/stdc++.h>
using namespace std;

string S;
map<int, int> tree_map;

int dfs(int pos) {
  if (pos == S.size()) return pos;
  if (S[pos] == '(') {
    int right = dfs(pos + 1);
    tree_map[pos] = right;
    return dfs(right + 1);
  } else {
    return pos;
  }
}

int delete_in(int pos, set<int> &right_set) {
  auto it = tree_map.lower_bound(pos);
  int left = it->second;
  while (true) {
    auto it2 = tree_map.lower_bound(pos);
    if (it2 != tree_map.end() && it2->second <= left) {
      right_set.erase(it2->second);
      tree_map.erase(it2);
    } else {
      break;
    }
  }
  auto it_left = tree_map.lower_bound(pos);
  auto it_right = right_set.lower_bound(pos);
  if (it_left == tree_map.end() && it_right == right_set.end()) {
    it_right--;
    pos = *it_right;
  } else if (it_left == tree_map.end()) {
    pos = *it_right;
  } else {
    pos = min(it_left->first, *it_right);
  }
  return pos;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  int N, M, pos;
  cin >> N >> M >> pos;
  pos--;
  cin >> S;
  string input;
  cin >> input;
  dfs(0);
  vector<int> pairs(N);
  for (const auto &p : tree_map) {
    pairs[p.first] = p.second;
    pairs[p.second] = p.first;
  }
  set<int> right_set;
  for (int i = 0; i < N; ++i) {
    if (S[i] == ')') right_set.insert(i);
  }

  for (int i = 0; i < M; ++i) {
    if (S[pos] == '(') {
      if (input[i] == 'L') {
        auto it_left = tree_map.lower_bound(pos);
        auto it_right = right_set.lower_bound(pos);
        it_left--;
        if (it_right == right_set.begin()) {
          pos = it_left->first;
        } else {
          it_right--;
          pos = max(it_left->first, *it_right);
        }
      } else if (input[i] == 'R') {
        auto it_left = tree_map.lower_bound(pos);
        auto it_right = right_set.lower_bound(pos);
        it_left++;
        if (it_left == tree_map.end()) {
          pos = *it_right;
        } else {
          pos = min(it_left->first, *it_right);
        }
      } else {  //'D'
        pos = delete_in(pos, right_set);
      }
    } else {
      // when ')'
      if (input[i] == 'L') {
        auto it_left = tree_map.lower_bound(pos);
        auto it_right = right_set.lower_bound(pos);
        it_left--;
        if (it_right == right_set.begin()) {
          pos = it_left->first;
        } else {
          it_right--;
          pos = max(it_left->first, *it_right);
        }
      } else if (input[i] == 'R') {
        auto it_right = right_set.lower_bound(pos);
        it_right++;
        auto it_left = tree_map.lower_bound(pos);
        if (it_left == tree_map.end()) {
          pos = *it_right;
        } else {
          pos = min(it_left->first, *it_right);
        }
      } else {
        pos = delete_in(pairs[pos], right_set);
      }
    }

    // DEBUG
    // cerr << pos << endl;
    // for (const auto &p : tree_map) {
    //   cerr << p << endl;
    // }
  }

  vector<bool> e(N, false);
  for (const auto &p : tree_map) {
    e[p.first] = true;
    e[p.second] = true;
  }
  string ans = "";
  for (int i = 0; i < N; ++i) {
    if (e[i]) ans += S[i];
  }
  cout << ans << endl;
}