Baek Junアルゴリズム1406号:編集


リンク


https://www.acmicpc.net/problem/1406

質問する


線を1本実現する簡単なエディタ.このエディタには英語の小文字しか記録できません.最大600,000文字を入力できます.
このエディタには、文の一番前(最初の文字の左側)、文の一番後ろ(最後の文字の右側)、または文の真ん中の任意の位置(連続する2文字の間)にカーソルを置く「カーソル」というものがあります.つまり、現在のエディタに長さLの文字列を入力すると、カーソルはL+1の位置に配置できます.
このエディタでは、次のコマンドがサポートされています.
  • Lカーソルを左に1マス(文の一番前にカーソルを置く)
  • カーソルを1つ右に移動
  • D(文章の末尾にカーソルを置く)
  • Bカーソル左側の文字を削除(文の先頭にカーソルがある場合は無視)
    削除すると、カーソルが左にスペースを移動しますが、実際にはカーソルの右側の文字は
  • です.
    カーソル左側に
  • P$$を追加
    エディタに文字列を入力し、その文字列の後、すべてのコマンドを実行し、エディタに入力した文字列を取得するプログラムを作成します.しかし、コマンドが実行される前に、カーソルは文の末尾にあると言われています.
  • 入力


    最初の行には、初期入力エディタの文字列が表示されます.この文字列の長さはNで、英語の小文字のみで、長さは100000を超えない.2行目には、入力する命令数を示す整数M(1≦M≦500000)が与えられる.3行目から、M行の間に入力するコマンドを順番に与えます.コマンドは、上記の4つのいずれかの形式でのみ与えられます.

    しゅつりょく


    最初の行ですべてのコマンドを実行した後、出力エディタに入力した文字列.

    入力と出力の例



    プールコード(C++)

    #include <bits/stdc++.h>
    #define X first
    #define Y second
    #define pb push_back
    #define sz(a) int((a).size())
    #define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
    using namespace std;
    using ll = long long;
    using ull = unsigned long long;
    using dbl = double;
    using ldb = long double;
    using pii = pair<int,int>;
    using pll = pair<ll,ll>;
    using vi = vector<int>;
    using wector = vector<vector<int>>;
    
    int main(){
      fastio;
      string s; cin >> s;
      int n; cin >> n;
      list<char> L;
      for(auto c : s) L.push_back(c);
      auto cursor = L.end();
      while(n--){
        char a; cin >> a;
        if(a == 'L'){
          if(cursor != L.begin()) cursor--;
        }
        else if(a == 'D'){
          if(cursor != L.end()) cursor++;
        }
        else if(a == 'B'){
          if(cursor != L.begin()){
            cursor--;
            cursor = L.erase(cursor);
          }
        }
        else if(a == 'P'){
          char k; cin >> k;
          L.insert(cursor,k);
        }
      }
      for(auto c : L) cout << c; cout << "\n";
      return 0;
    }