torus711 のアレ

主に競技プログラミングの問題について書きます

Codeforces #271, A : Keyboard

問題概要

 QWERTY 配列のキーボードで単語をタイピングする際、両手のポジションが右または左に 1 つずれてしまった。ポジションがずれた方向と結果として入力された単語が与えられるので、入力しようとした単語を復元せよ。

解法

 与えられた単語に含まれる各文字について、1 文字ずつ復元して出力していきます。文字 c を復元する処理はおよそ 3 段階に分けられます。

  1. キーボードから文字 c を含む行を探す
  2. 文字 c がその行の何個目のキーか探す
  3. (該当する方向の)隣の文字を出力する

実際には、各行から文字 c を検索して、見つかったときにだけ 3 の処理をするようにすればよいです。

コード

#define FOR( e, c ) for ( auto &e : c )

const string keyboard[] = {
	"qwertyuiop",
	"asdfghjkl;",
	"zxcvbnm,./",
};

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

	char d;
	cin >> d;

	string s;
	cin >> s;

	FOR( c, s )
	{
		FOR( row, keyboard )
		{
			const int pos = row.find( c );
			if ( pos != string::npos )
			{
				cout << row[ pos + ( d == 'R' ? -1 : 1 ) ];
			}
		}
	}
	cout << endl;

	return 0;
}