1406


質問する


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

    入力


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

    しゅつりょく


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

    に答える


    アルゴリズム分類バーには、스택연결 리스트があり、接続リストに記入しようとします.
    STLのlistという2つの接続リストがあります.(リストはここです。を含む)

    この資料構造は、上記の図に示すように、各リストの前後に1つずつの양방향 반복자を提供する.
    この資料構造の特徴は,任意の位置で定数時間内に要素を挿入・削除できることである.
    また、벡터は連続メモリ(配列)であり、[]演算子によって必要な要素にデータをすばやく参照できますが、리스트は連続(ノード)ではなく、繰り返し文字のみで順次ナビゲートできます.

    コード#コード#

    #include <iostream>
    #include <string>
    #include <list>
    
    using namespace std;
    
    int main()
    {
        string str;
        int n;
    
        cin >> str;
    	cin >> n;
    	list<char> arr(str.begin(), str.end());
        auto cursor = arr.end(); // 반복자의 데이터 타입은 int가 아니다.
        for (int i = 0 ; i < n ; i++)
        {
        	char command;
    
    		cin >> command;
    		if (command == 'L')
    		{
    			if (cursor != arr.begin())
    				cursor--;
    		}
    		else if (command == 'D')
    		{
    			if (cursor != arr.end())
    				cursor++;
    		}
    		else if (command == 'B')
    		{
    			if (cursor != arr.begin())
    				cursor = arr.erase(--cursor);
    		}
    		else if (command == 'P')
    		{
    			char ch;
    			cin >> ch;
    			arr.insert(cursor, ch);
    		}
        }
    	for (auto& x : arr)
    		cout << x;
    	return (0);
    }