1406
2800 ワード
質問する
線を1本実現する簡単なエディタ.このエディタには英語の小文字しか記録できません.最大600,000文字を入力できます.
このエディタには、文の一番前(最初の文字の左側)、文の一番後ろ(最後の文字の右側)、または文の真ん中の任意の位置(連続する2文字の間)にカーソルを置く「カーソル」というものがあります.つまり、現在のエディタに長さLの文字列を入力すると、カーソルはL+1の位置に配置できます.
このエディタでは、次のコマンドがサポートされています.
削除すると、カーソルが左にスペースを移動するように見えますが、実際にはカーソルの右側の文字は
エディタに文字列を入力し、その文字列の後、すべてのコマンドを実行し、エディタに入力した文字列を取得するプログラムを作成します.しかし、コマンドが実行される前に、カーソルは文の末尾にあると言われています.
入力
最初の行には、初期入力エディタの文字列が表示されます.この文字列の長さは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);
}
Reference
この問題について(1406), 我々は、より多くの情報をここで見つけました
https://velog.io/@lsmmay322/백준-1406
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
最初の行ですべてのコマンドを実行した後、出力エディタに入力した文字列.
に答える
アルゴリズム分類バーには、스택
、큐
、연결 리스트
があり、接続リストに記入しようとします.
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);
}
Reference
この問題について(1406), 我々は、より多くの情報をここで見つけました
https://velog.io/@lsmmay322/백준-1406
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#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);
}
Reference
この問題について(1406), 我々は、より多くの情報をここで見つけました https://velog.io/@lsmmay322/백준-1406テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol