AOJ-ICPC 「王様の視察」
問題
King's Inspection | Aizu Online Judge
解説
まずはアルファベットをずらしていくため、順番通りに並べた配列を用意します。
alp[]={'a' , 'b'..'z','A'....'Y','Z'} のような配列です。
また、「いくつずらすか」を保存した配列は何周もする可能性があるので、今何番目を見ているかを保存するv_countも用意しました。
最後に、今ずらそうとしている文字が配列alp上で何番目に当たるか(つまりずらし始める初期位置)を知らないといけないので、これをアスキーコードを利用しposという変数で取得します。
#include <bits/stdc++.h> #define rep(i,j,k) for(int i=(int)j;i<(int)k;i++) #define itrep(i,x) for(auto i=(x).begin(); i!=(x).end();i++) #define Sort(x) sort((x).begin(),(x).end()) #define all(x) (x).begin(),(x).end() #define fi first #define se second #define vi vector<int> #define INF (int)1e9 #define INFL 1e18 #define MOD 1000000007 #define pb push_back #define MP make_pair #define PI 3.1415926535 typedef long long int ll; typedef std::pair<int,int> P; int D=1; int dx[4]={0,1,0,-1},dy[4]={-1,0,1,0}; using namespace std; int main(){ int n; vector<char> alp; rep(i,0,26)alp.pb('a'+i); rep(i,0,26)alp.pb('A'+i); //alp[]={'a','b'.......'Y','Z'} while(cin>>n){ if(n==0)break; vector<int> v(n); rep(i,0,n)cin>>v[i]; string s; cin>>s; int v_count=0; //v_countはずらす回数を表す数字の配列の添字 //下に出てくるposは'a'-'Z'までを格納した配列alpの添字 rep(i,0,s.size()){ if('a'<=s[i]&&s[i]<='z'){ int pos=s[i]-'a'; //小文字の時、'a'との差がalpの添字 }else { int pos=s[i]-'A'+26; //大文字の時、'A'との差に26を足せばalpの添字 } //いざ、文字をずらす rep(j,0,v[v_count]){ pos--; if(pos==-1)pos=51; } cout<<alp[pos]; //pos番目のalpを出力 v_count++; if(v_count==n)v_count=0; } cout<<endl; } return 0; }