yukicoder No.18 - うーさー暗号

Source

ニコニコミュニティ
問題文

問題概要

アルファベット大文字を $1$ 回シフトすると,次のアルファベットの文字になります.
ただし,$\verb|Z|$ は $\verb|A|$ になります.
アルファベット大文字からなる文字列をうーさー暗号で暗号化するとは,$k$ 文字目の文字を $k$ 回シフトすることです.
うーさー暗号にて暗号化された文字列 $S$ が与えられるので,暗号化される前の文字列を求める問題.

解法

書くだけ.
$k$ 回のシフトを足し算引き算と ${\rm mod}$ で行えば時間計算量 $O(|S|)$,$1$ 回ずつシフトすれば時間計算量 $O(|S|^2)$.

C++によるスパゲッティなソースコード

#include<bits/stdc++.h>
using namespace std;

#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

#define mygc(c) (c)=getchar_unlocked()
#define mypc(c) putchar_unlocked(c)

int reader(char c[]){int i,s=0;for(;;){mygc(i);if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t'&&i!=EOF) break;}c[s++]=i;for(;;){mygc(i);if(i==' '||i=='\n'||i=='\r'||i=='\t'||i==EOF) break;c[s++]=i;}c[s]='\0';return s;}

int N;
char S[10000];

int main(){
  int i, j, k;

  N = reader(S);
  rep(i,N) S[i] = (S[i]-'A'+260000-i-1)%26 + 'A';
  puts(S);

  return 0;
}

Current time: 2017年11月22日00時43分57秒
Last modified: 2014年11月17日00時35分53秒 (by laycrs)
Tags: Competitive_Programming yukicoder
トップページに戻る

Logged in as: unknown user (not login)

ログイン: