[伯俊/C+]5397号:鍵錠


質問する


昌英は江山のパスワードを盗むため、江山が使っているパソコンに鍵を取り付けた.数日の待ち時間を経て、昌英はついに江山がパスワードウィンドウに入力した字を手に入れた.
キーを押すと、ユーザーがキーボードを押したすべてのコマンドが記録されます.したがって、江山がパスワードを入力すると、矢印やbackspaceを入力しても正しいパスワードが検出される.
江山がパスワードウィンドウに入力した鍵が与えられた場合、江山のパスワードを識別するプログラムを作成してください.江山がキーボードで入力したキーは、大文字、小文字、数字、スペース、矢印です.
質問の表示

入力


最初の行は、テスト例の数を示します.各テスト例は1行で構成され、江山入力の順序に従って長さLの文字列が与えられる.(1≦L≦100000)江山がbackspaceを入力した場合は「-」を与える.このとき、カーソルの直前に文字がある場合は消去します.矢印は「<」と「>」と入力されます.このとき、カーソルの位置が移動可能であれば、1を左または右に移動します.残りの文字はパスワードの一部です.もちろん、後でbackspaceで削除できます.カーソルの位置が最後の行でない場合は、カーソルとカーソルの右側のすべての文字が1つ右に移動します.

しゅつりょく


各テストボックスに対して、江山のパスワードを出力します.パスワードの長さは常にゼロより大きい.



アイデア


入力した文字列をlistに変換し、iteratorを使用して文字を比較および挿入/削除/カーソルで移動します.

コード#コード#

#include <iostream>
#include <list>
using namespace std;

int main() {
	int T;
	cin >> T;
	string L;
	list<char> lis;
	list<char>::iterator iter;
	while (T--) {
		lis.clear();
		iter = lis.begin();
		cin >> L;
		for (int i = 0; i < L.length(); i++) {
			if (L[i] == '-' && iter != lis.begin()) {
				iter = lis.erase(--iter);
			}
			else if (L[i] == '<' && iter != lis.begin()) {
				iter--;
			}
			else if (L[i] == '>' && iter != lis.end()) {
				iter++;
			}
			else if (L[i] != '-' && L[i] != '<' && L[i] != '>') {
				lis.insert(iter, L[i]);
			}
		}
		for (iter = lis.begin(); iter != lis.end(); iter++) {
			cout << *iter;
		}
		cout << "\n";
	}
	return 0;
}

試行錯誤


リストとiteratorの声明と初期化方法が分からないので、本を探しました.勉強して1週間もしないうちに覚えられなくなった.for文の最後の条件をL[i]>='A'&L[i]<='zと書きます.2番目のforクエリのインデックスを反復器に設定し、int iを宣言すると、出力がタイムアウトします.stringのlength()とsize()は、文字列の長さと実際に使用されるメモリサイズをそれぞれ表します.最初のfor文の条件をL.size()と指定すると、出力タイムアウトが発生します.
リファレンス