kengo92iの日記

プログラミングとかやったことの記録を書いていきます。

AOJ-2508 : 王様の視察

King's Inspection | Aizu Online Judge

王様が回る駅の順番が書かれたリストがある。鍵を元に復号する。
リストにはa-zA-Zまでの文字が複数書かれてあり、鍵は対応する駅から何駅戻るかの数字が書かれている。aから1つ戻った場合はZになる。


問題を読めば、モジュロ演算が必要になることが読み取れる。
しかし、ASCIIコード的にはa-zA-Zではなく、A-Z[\¥]^_`a-zとなっている
ために、そのまま対応させることができないので、変換表の位置に合うようにしています。変換表の文字列を前から探索して一致した添字を返すだけならわざわざ位置合わせする必要はないです。

//http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2508

#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<cmath>
#include<climits>
#include<ctime>
#include<cstring>
#include<numeric>

#define ALL(v) (v).begin(),(v).end()
#define REP(i,p,n) for(int i=p;i<(int)(n);++i)
#define rep(i,n) REP(i,0,n)
#define dump(a) (cerr << #a << "=" << (a) << endl)
#define DUMP(list) cout << "{ "; for(auto nth : list){ cout << nth << " "; } cout << "}" << endl;

using namespace std;

string eki = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

int main()
{
	int N;
	while(cin >> N && N)
	{
		vector<int> keys(N);
		rep(nth,N){
			cin >> keys[nth];
		}
		string S;
		cin >> S;
		
		string ans;
		int pos=0;
		rep( i, S.size() )
		{
			int num;
			if('a'<= S[i] && S[i] <= 'z'){
				num = S[i] - 'a';
			}
			else if('A' <= S[i] && S[i] <= 'Z'){
				num = S[i] - 39;
			}
			char res = eki[ ( num - keys[pos] + 52 ) % 52 ];
			pos = (pos+1)%N;
			ans += res;
		}
		cout << ans << endl;
	}
	return 0;
}