gotutiyan’s blog

競技プログラミングをやったりopenframeworksでお絵かきをしたりしています。

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;
}