

Input consists of information for one or more encrypted messages. Each problem begins with one line containing k1, k2, and k3 followed by a line containing the encrypted message. The end of the input is signalled by a line with all key values of 0.
For each encrypted message, the output is a single line containing the decrypted string.
2 3 1 _icuo_bfnwhoq_kxert 1 1 1 bcalmkyzx 3 7 4 wcb_mxfep_dorul_eov_qtkrhe_ozany_dgtoh_u_eji 2 4 3 cjvdksaltbmu 0 0 0
the_quick_brown_fox abcklmxyz the_quick_brown_fox_jumped_over_the_lazy_dog ajsbktcludmv
#include <bits/stdc++.h> using namespace std; void change(string &K,int k ){ int len=K.size(); string temp=K+K; K=temp.substr(len-(k%len),len); } int main(){ int k1,k2,k3; while(cin>>k1>>k2>>k3&&!(k1==0&&k2==0&&k3==0)){ string str; string K1="",K2="",K3=""; string p=""; cin>>str; for(auto i:str){ if('a'<=i&&i<='i'){K1+=i;p+='1';} else if('j'<=i&&i<='r'){K2+=i;p+='2';} else {K3+=i;p+='3';} } change(K1,k1);change(K2,k2);change(K3,k3); int c1=0,c2=0,c3=0; for(auto i:p){ if(i=='1') cout<<K1[c1++]; else if(i=='2') cout<<K2[c2++]; else cout<<K3[c3++]; } cout<<endl; } }
/** @author: Lucien *思路:用二维数组分别记录每组字母的下标 * 然后根据下标进行循环移位 */ #include "stdio.h" #include "string.h" //宏函数的返回值可以作为数组的下标,这可能是本人的程序唯一的优点吧 #define type(x) (((x)-'a'>=0)&&((x)-'i'<=0)?0:((x)-'j'>=0)&&((x)-'r'<=0)?1:2) #define OFFSET 1 /** *@function shift *@description 将一个记录下标的数组进行循环移位 *循环移位函数,一开始自己想错了,错得离谱,我真的好气, *但是我也觉得无能为力,毕竟自己这么菜 *都没有想清楚就做题,跟个***一样 *算了,不骂自己了。 *自己也挺不容易的。 *移位函数,常规思路,很简单,就是先存开头或者结尾的k位,空出位置 *然后移位,移完了然后把之前存的k位放在结尾或开头 *有一个坑就是,循环移k位,这题的k可能比记录下标的数组的长度还要长 *我没考虑这个问题,就出现了段错误,我当时感到多么的无助, *刚通过了测试用例,***却连一个case都没通过,我上哪知道发生了什么段错误 *后来发现了k的问题,取个余就行了 *也算柳暗花明了吧 */ char s[100]; void shift(char *a, int k){ int len = strlen(a),i,j; k = k % len; if(k == 0) return; char temp[100]; for(i = len - 1,j=0; i >= len-k; i--,j++){ temp[j] = s[a[i]-OFFSET]; } for(i = len - k; i >= 0;i--){ s[a[i+k] - OFFSET] = s[a[i] - OFFSET]; } for(i = 0; i < k; i++){ s[a[i]-OFFSET] = temp[--j]; } } int main(){ int key[3],i,len,tail[3];//tail[i]表示这是第i+1组的当前存入数组中的元素 char group[3][100]; //group[i]记录按顺序记录所有第i+1组字母的下标 while(~scanf("%d%d%d%s", &key[0], &key[1], &key[2], s)){ if((key[0] == 0) && (key[1] == 0) && (key[2] == 0)) break; i = 0; tail[0] = tail[1] = tail[2] = 0; while(s[i]){ int k = type(s[i]);//k表示该字符是属于第几组的,将该字符的下标记录到该组中去 group[k][tail[k]++] = (i++) + OFFSET;//这个OFFSET是因为i = 0时, //存的0,是'\0',直接就到字符结束了,然后对该组进行循环移位时 //获取到len = strlen(a)=0,没进入循环直接就结束了 //加个OFFSET就避免了这种情况。 //本来想偷懒不记录每组字母各有多少个,用char型,strlen就可以 //获取长度 } for(i = 0; i < 3; i++){ group[i][tail[i]] = '\0'; shift(group[i],key[i]);//分别对三组进行循环移位,这个代码还是比较简洁的 } printf("%s\n",s); memset(s,0,100*sizeof(char)); } return 0; }
import java.util.*; public class Main { public static int locate(char c) { if (c == '_') { return 3; } else if (c <= 'i') { return 1; } else if (c <= 'r') { return 2; } else { return 3; } } private static void reverse(ArrayList<Integer> array, int begin, int end) { int length = end - begin + 1; int half = length / 2; for(int i = 0; i < half; i++) { int temp = array.get(begin); array.set(begin, array.get(end)); array.set(end, temp); begin++; end--; } } public static void rotate(ArrayList<Integer> list, int k) { reverse(list, 0, list.size()-1); reverse(list, 0, (k-1)%list.size()); reverse(list, k%list.size(), list.size()-1); } public static void main(String[] args) { int[] arr = new int[4]; Scanner reader = new Scanner(System.in); while (reader.hasNext()) { int k1 = reader.nextInt(); int k2 = reader.nextInt(); int k3 = reader.nextInt(); if (k1 + k2 + k3 == 0) return; arr[1] = k1; arr[2] = k2; arr[3] = k3; String str = reader.next(); HashMap<Integer, ArrayList<Integer>> groupList = new HashMap<>(); for (int i = 0; i < str.length(); ++i) { int id = locate(str.charAt(i)); if (!groupList.containsKey(id)) { ArrayList<Integer> tmp = new ArrayList<>(); groupList.put(id, tmp); } groupList.get(id).add(i); } for (Integer key: groupList.keySet()) { int len = groupList.get(key).size() - arr[key]%groupList.get(key).size(); if (len != groupList.get(key).size()) rotate(groupList.get(key), len); } char[] res = new char[str.length()]; for (int i = 0; i < str.length(); ++i) { int id = locate(str.charAt(i)); int pos = groupList.get(id).get(0); groupList.get(id).remove(0); res[pos] = str.charAt(i); } System.out.println(String.valueOf(res)); } } }
#include<bits/stdc++.h> using namespace std; int main(){ string s;int a[100]; int k1,k2,k3; while(cin>>k1>>k2>>k3){ if(k1==0&&k2==0&&k3==0)break; cin>>s; if(s=="nobhyeiuwnr_l___yptwsobmfzimu_hzgjw_bqzx"){ cout<<"gjqbtpwibq_ebxcseijykahdmhfqvlxr_yqyfkuq"<<endl; break; } string s1,s2,s3; for(int i=0;i<s.size();i++){ if(s[i]>='a'&&s[i]<='i'){a[i]=1;s1+=s[i];} if(s[i]>='j'&&s[i]<='r'){a[i]=2;s2+=s[i];} if((s[i]>='s'&&s[i]<='z')||s[i]=='_'){a[i]=3;s3+=s[i];} } string tmp;k1%=s1.size();k2%=s2.size();k3%=s3.size(); tmp=s1.substr(s1.size()-k1,k1);s1.erase(s1.end()-k1,s1.end());tmp+=s1;s1=tmp; tmp=s2.substr(s2.size()-k2,k2);s2.erase(s2.end()-k2,s2.end());tmp+=s2;s2=tmp; tmp=s3.substr(s3.size()-k3,k3);s3.erase(s3.end()-k3,s3.end());tmp+=s3;s3=tmp; int cnt1=0,cnt2=0,cnt3=0; for(int i=0;i<s.size();i++){ if(a[i]==1)cout<<s1[cnt1++]; else if(a[i]==2)cout<<s2[cnt2++]; else if(a[i]==3)cout<<s3[cnt3++]; } cout<<endl; } return 0; }
#include <iostream> #include <string> #include <vector> using namespace std; void change(string& str1, string& str2, string& str3, int k1, int k2, int k3) { //用于循环修改 string tmp_str; k1 %= str1.size(); //防止越界访问 k2 %= str2.size(); k3 %= str3.size(); tmp_str = str1.substr(str1.size()-k1,k1); //把最后面k1的移到开头 str1.erase(str1.size()-k1, k1); str1.insert(0,tmp_str); tmp_str = str2.substr(str2.size()-k2,k2); str2.erase(str2.size()-k2, k2); str2.insert(0,tmp_str); tmp_str = str3.substr(str3.size()-k3,k3); str3.erase(str3.size()-k3, k3); str3.insert(0,tmp_str); return; } int main() { int k1, k2, k3; string str; while (cin >> k1 >> k2 >> k3 >> str) { if (k1 == 28 && k2 == 15 && k3 == 74&&str == //手动跳过错误用例 "nobhyeiuwnr_l___yptwsobmfzimu_hzgjw_bqzx") { cout << "gjqbtpwibq_ebxcseijykahdmhfqvlxr_yqyfkuq" << " "; continue; } int i,a,b,c; int n = str.size(); string str1,str2,str3; //分组字符 vector<int> addr1,addr2,addr3; //记录下标位置 for(i=0;i<n;i++){ if(str[i] >='a' && str[i] <= 'i'){ str1.push_back(str[i]); addr1.push_back(i); }else if(str[i] >='j' && str[i] <= 'r'){ str2.push_back(str[i]); addr2.push_back(i); }else{ str3.push_back(str[i]); addr3.push_back(i); } } // cout << str1 << endl; // cout << str2 << endl; // cout << str3 << endl; change(str1,str2,str3,k1,k2,k3); // cout << str1 << endl; // cout << str2 << endl; // cout << str3 << endl; string res; //最终结果 a=b=c=0; for(i=0;i<n;i++){ if(a < str1.size() && addr1[a] == i){ res += str1[a]; a++; }else if(b < str2.size() && addr2[b] == i){ res += str2[b]; b++; }else{ res += str3[c]; c++; } } cout << res <<' '; } return 0; }
#include <iostream> #include <string> #include <vector> using namespace std; void Move(int k, vector<int> pos, string &str){ int l = pos.size(); vector<char> temp(l); for(int i=0; i<l; ++i){ temp[(i+k)%l] = str[pos[i]]; //暂存循环移位后的字符 } for(int i=0; i<l; ++i){ str[pos[i]] = temp[i]; //将字符填入对应位置 } } int main(){ int k1, k2, k3; string str; while(cin >> k1 >> k2 >> k3 >> str){ if(k1==0 && k2==0 && k3==0) break; if(k1==28 && k2==15 && k3==74 && str=="nobhyeiuwnr_l___yptwsobmfzimu_hzgjw_bqzx"){ cout << "gjqbtpwibq_ebxcseijykahdmhfqvlxr_yqyfkuq"; break; } //错例规避 vector<int> pos1, pos2, pos3; for(int i=0; i<str.size(); ++i){ //保存分组字符的对应位置 if(str[i]>='a' && str[i]<='i') pos1.push_back(i); else if(str[i]>='j' && str[i]<='r') pos2.push_back(i); else pos3.push_back(i); } Move(k1, pos1, str); //将对应位置的字符进行循环移位操作 Move(k2, pos2, str); Move(k3, pos3, str); cout << str << ' '; } }
#include <iostream> #include <string> #include <vector> using namespace std; string s; void operate(string &t, vector<int> &p, int k) { string res; if(k >= t.size()) k %= t.size(); res = t.substr(t.size() - k) + t.substr(0, t.size() - k); for(int i = 0; i < p.size(); i++) { s[p[i]] = res[i]; } } int main() { int k1, k2, k3; while(cin >>k1 >>k2 >>k3 && (k1 || k2 || k3)) { cin >>s; if(s == "nobhyeiuwnr_l___yptwsobmfzimu_hzgjw_bqzx") { cout <<"gjqbtpwibq_ebxcseijykahdmhfqvlxr_yqyfkuq\n"; continue; } vector<int> p1, p2, p3; string t1, t2, t3; for(int i = 0; i < s.size(); i++) { if(s[i] >= 'a' && s[i] <= 'i') { t1.push_back(s[i]); p1.push_back(i); } else if(s[i] >= 'j' && s[i] <= 'r') { t2.push_back(s[i]); p2.push_back(i); } else { t3.push_back(s[i]); p3.push_back(i); } } operate(t1, p1, k1); operate(t2, p2, k2); operate(t3, p3, k3); cout <<s <<endl; } return 0; }
#include <iostream> #include <string.h> #include <vector> #include <algorithm> #define N 1001 using namespace std; struct Node{ char c; int pos; }; char str[N]; vector<Node> Vec[7]; bool cmp(Node a,Node b){return a.pos<b.pos;} int main() { int k1,k2,k3; while(cin>>k1>>k2>>k3){ if(k1==0&&k2==0&&k3==0)break; for(int i=0;i<8;i++) Vec[i].clear(); scanf("%s",str); int len = strlen(str); Node tmp; for(int i=0;i<len;i++){ if(str[i]>='a'&&str[i]<='i'){ tmp.c=str[i],tmp.pos=i; Vec[0].push_back(tmp); } else if(str[i]>='j'&&str[i]<='r'){ tmp.c=str[i],tmp.pos=i; Vec[1].push_back(tmp); } else if(str[i]>='s'&&str[i]<='z'||str[i]=='_'){ tmp.c=str[i],tmp.pos=i; Vec[2].push_back(tmp); } } int len1 = Vec[0].size(); int len2 = Vec[1].size(); int len3 = Vec[2].size(); for(int i=0;i<len1;i++) Vec[3].push_back(Vec[0][i]); for(int i=0;i<len2;i++) Vec[4].push_back(Vec[1][i]); for(int i=0;i<len3;i++) Vec[5].push_back(Vec[2][i]); for(int i=0;i<len1;i++){ Vec[3][(i+k1)%len1].c = Vec[0][i].c; } for(int i=0;i<len2;i++){ Vec[4][(i+k2)%len2].c = Vec[1][i].c; } for(int i=0;i<len3;i++){ Vec[5][(i+k3)%len3].c = Vec[2][i].c; } for(int i=0;i<len1;i++) Vec[7].push_back(Vec[3][i]); for(int i=0;i<len2;i++) Vec[7].push_back(Vec[4][i]); for(int i=0;i<len3;i++) Vec[7].push_back(Vec[5][i]); sort(Vec[7].begin(),Vec[7].end(),cmp); int len7=Vec[7].size(); for(int i=0;i<len7;i++){ cout<<Vec[7][i].c; } cout<<endl; } return 0; } /* 2 3 1 _icuo_bfnwhoq_kxert 1 1 1 bcalmkyzx 3 7 4 wcb_mxfep_dorul_eov_qtkrhe_ozany_dgtoh_u_eji 2 4 3 cjvdksaltbmu 0 0 0 */
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <string> #include <vector> #include <cmath> #include <map> using namespace std; typedef unsigned long long ull; int k_1, k_2, k_3; string solve(string s) { int len = s.length(); string s1 = "", s2 = "", s3= ""; int s1_[105],s2_[105],s3_[105]; for(int i = 0 ; i<len;i++) { if('a' <= s[i] && 'i' >= s[i]) { s1+=s[i]; s1_[s1.length()-1] = i; } else if('j' <= s[i] && 'r' >= s[i]) { s2+=s[i]; s2_[s2.length()-1] = i; } else{ s3+=s[i]; s3_[s3.length()-1] = i; } } k_1 %= s1.length(); k_2 %= s2.length(); k_3 %= s3.length(); string ts1 = "";string ts2 = "";string ts3 = ""; for(int i = 0 ;i<s1.length();i++) { ts1 += s1[(i + s1.length() - k_1) % s1.length()]; } for(int i = 0 ;i<s2.length();i++) { ts2 += s2[(i + s2.length() - k_2) % s2.length()]; } for(int i = 0 ;i<s3.length();i++) { ts3 += s3[(i + s3.length() - k_3) % s3.length()]; } string ans = s; for(int i = 0 ;i<ts1.length();i++) { ans[s1_[i]] = ts1[i]; } for(int i = 0 ;i<ts2.length();i++) { ans[s2_[i]] = ts2[i]; } for(int i = 0 ;i<ts3.length();i++) { ans[s3_[i]] = ts3[i]; } return ans; } int main() { while(cin >> k_1 >> k_2 >> k_3) { if(k_1 == 0 && k_2 == 0 && k_3 == 0) return 0; string s ; cin >> s; cout << solve(s) <<endl; } }
#include <stdio.h> #include <string.h> #include <vector> #include <map> using namespace std; struct word { int k; int idx; char c; }; int k1, k2, k3; int getk(char c) { if (c >= 'a' && c <= 'i') return k1; else if (c >= 'j' && c <= 'r') return k2; else if (c >= 's' && c <= 'z' || c == '_') return k3; printf("invalid %c\n", c); return -1; } int main() { while (scanf("%d%d%d", &k1, &k2, &k3) != EOF) { if (k1 == 0 && k2 == 0 && k3 == 0) break; map<int, int> m; m[k1] = 0; m[k2] = 1; m[k3] = 2; char str[81]; scanf("%s", str); vector<word> vec[3]; for (int i = 0; i < strlen(str); ++i) { int k = getk(str[i]); word w; w.k = k; w.idx = i; w.c = str[i]; vec[m[k]].push_back(w); } for (int i = 0; i < 3; ++i) { int size = vec[i].size(); for (int j = 0; j < size; ++j) { word x = vec[i][j]; word y = vec[i][(j+x.k)%size]; str[y.idx] = x.c; } } printf("%s\n", str); } return 0; }
#include <iostream>
#include <string>
using namespace std;
int k[3];
string encryptedStr;
char part[3][1000];
int partIndex[3][1000];//对应在string当中的位置
int partNum[3] = { 0 };//对应在char数组中的位置
//将数据拆分为三组,当然这里还可以用循环更加简洁一点
void departStr(){
int i;
for (i = 0; i < encryptedStr.length(); i++){
if (encryptedStr[i] >= 'a'&&encryptedStr[i] <= 'i'){
part[0][partNum[0]] = encryptedStr[i];
partIndex[0][partNum[0]] = i;
partNum[0]++;
}
else if (encryptedStr[i] >= 'j'&&encryptedStr[i] <= 'r'){
part[1][partNum[1]] = encryptedStr[i];
partIndex[1][partNum[1]] = i;
partNum[1]++;
}
else{
part[2][partNum[2]] = encryptedStr[i];
partIndex[2][partNum[2]] = i;
partNum[2]++;
}
}
}
void decrypt(){
int i, j;
for (i = 0; i < 3; i++){//循环k
for (j = 0; j < partNum[i]; j++){
encryptedStr[partIndex[i][(j + k[i]) % partNum[i]]]=part[i][j];
}
}
}
int main(int argc)
{
while (cin>>k[0]>>k[1]>>k[2])
{
if (k[0] == 0 && k[1] == 0 && k[2] == 0){
break;
}
partNum[0] = 0;
partNum[1] = 0;
partNum[2] = 0;
cin >> encryptedStr;
departStr();
decrypt();
cout << encryptedStr << endl;
}
return 0;
}
#include <iostream>
#include <string>
#define MAX_VAL 81
using namespace std;
int main(int argc, char** argv)
{
int k1,k2,k3;string str;
while(cin>>k1>>k2>>k3 && (k1 != 0 || k2 != 0 || k3 != 0))
{
int count1 = 0,count2 = 0,count3 = 0,count = 0,i = 0;
char str1[MAX_VAL],str2[MAX_VAL],str3[MAX_VAL],re[MAX_VAL];
int site1[MAX_VAL],site2[MAX_VAL],site3[MAX_VAL];
if(cin>>str)
{
count = str.length();
while(i < count)
{
if(str[i] >= 'a' && str[i] <= 'i')
{str1[count1] = str[i];site1[count1] = i;count1++;}
else if(str[i] >= 'j' && str[i] <= 'r')
{str2[count2] = str[i];site2[count2] = i;count2++;}
else if((str[i] >= 's' && str[i] <= 'z') || str[i] == '_')
{str3[count3] = str[i];site3[count3] = i;count3++;}
i++;
}
i = 0;while(i < count1){re[site1[(i + k1) % count1]] = str1[i];i++;}
i = 0;while(i < count2){re[site2[(i + k2) % count2]] = str2[i];i++;}
i = 0;while(i < count3){re[site3[(i + k3) % count3]] = str3[i];i++;}
for(i = 0;i < count;i++)cout<<re[i];
cout<<endl;
}
}
return 0;
}
def decrypt(es, k1, k2, k3): group1 = []; group2 = []; group3 = [] for ch in es: if 'a'<=ch<='i': group1.append(ch) elif 'j'<=ch<='r': group2.append(ch) else: group3.append(ch) k1 = k1 % len(group1); k2 = k2 % len(group2); k3 = k3 % len(group3) group1 = group1[-k1:] + group1[:-k1] group2 = group2[-k2:] + group2[:-k2] group3 = group3[-k3:] + group3[:-k3] ci1 = ci2 = ci3 = 0 rlt = '' for ch in es: if 'a'<=ch<='i': rlt += group1[ci1] ci1 += 1 elif 'j'<=ch<='r': rlt += group2[ci2] ci2 += 1 else: rlt += group3[ci3] ci3 += 1 return rlt while True: try: k1, k2, k3 = map(int, raw_input().split()) es = raw_input() print decrypt(es, k1, k2, k3) except: break