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!