解いた問題のソースコードと解説など。


POJ 1107 W's Cipher

問題

アルファベットとアンダーバーからなる文字種を[a-i]、[j-r]、[s-zと_]の3グループに分ける。
文字置換による文章の暗号化を行いたい。暗号化の方法は平文の文字を一つずつ見ていき、その文字がグループiに属する時、その文字の右側を見ていって、グループiに所属するki個目の文字で置換する。
暗号文が与えられるので平文を出力せよ。

やりかた

暗号化と逆の方法をとる。その文字がグループiに属する時、その文字の左側を見ていって、グループiに所属するki個目の文字で置換すれば平文が求まる。

以下ソース。

int gr(char c){
  if('a' <= c && c <= 'i') return 0;
  if('j' <= c && c <= 'r') return 1;
  else return 2;
}
int k[3];
int main(int argc, char **argv){
  string s;
  while(cin >> k[0] >> k[1] >> k[2], k[0] + k[1] + k[2]){
    cin >> s;
    string t = s;
    for(int i = 0; i < s.size(); i++){
      int idx = i, skip = 0;
      while(1){
	idx--;
	idx = (idx + s.size()) % s.size();
	skip += (gr(s[i]) == gr(s[idx]));
	if(skip == k[gr(s[i])]){
	  t[i] = s[idx];
	  break;
	}
      }
    }
    cout << t << endl;
  }
  return 0;
}
Get up! 明日のSUPER ST@R!