题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=42
解密的题最恶心了
小组内部的移动,与其他小组无关。比如说第一个样例的第一组为 icbfhe ,在密文中的位置分别为(2,3,7,8,11,17),解密时向右移动两位变成(7,8,11,17,2,3),只要让第一组密文分别移动到相应的位置就可以了。
(PS:如果复制代码的话,一定要记得做相应的改变,不然会死人的)
#include<iostream> #include<cstring> using namespace std; char cipher[100],plain[100]; int groupNum[100]; char groupChar[100]; int k1,k2,k3; int main() { while (cin>>k1>>k2>>k3 && (k1+k2+k3 != 0)) { memset(cipher,0,sizeof(cipher)); memset(plain,0,sizeof(plain)); cin>>cipher; memset(groupNum,0,sizeof(groupNum)); memset(groupChar,0,sizeof(groupChar)); for (int i=0; i<strlen(cipher); i++) if (cipher[i] >= 'a' && cipher[i] <= 'i') { groupNum[0]++; groupNum[groupNum[0]] = i; groupChar[groupNum[0]] = cipher[i]; } for (int k=0; k<k1; k++) { int tmp = groupNum[1]; for (int i=1; i<=groupNum[0]-1; i++) groupNum[i] = groupNum[i+1]; groupNum[groupNum[0]] = tmp; } for (int i=1; i<=groupNum[0]; i++) plain[groupNum[i]] = groupChar[i]; memset(groupNum,0,sizeof(groupNum)); memset(groupChar,0,sizeof(groupChar)); for (int i=0; i<strlen(cipher); i++) if (cipher[i] >= 'j' && cipher[i] <= 'r') { groupNum[0]++; groupNum[groupNum[0]] = i; groupChar[groupNum[0]] = cipher[i]; } for (int k=0; k<k2; k++) { int tmp = groupNum[1]; for (int i=1; i<=groupNum[0]-1; i++) groupNum[i] = groupNum[i+1]; groupNum[groupNum[0]] = tmp; } for (int i=1; i<=groupNum[0]; i++) plain[groupNum[i]] = groupChar[i]; memset(groupNum,0,sizeof(groupNum)); memset(groupChar,0,sizeof(groupChar)); for (int i=0; i<strlen(cipher); i++) if (cipher[i] >= 's' && cipher[i] <= 'z' || cipher[i] == '_') { groupNum[0]++; groupNum[groupNum[0]] = i; groupChar[groupNum[0]] = cipher[i]; } for (int k=0; k<k3; k++) { int tmp = groupNum[1]; for (int i=1; i<=groupNum[0]-1; i++) groupNum[i] = groupNum[i+1]; groupNum[groupNum[0]] = tmp; } for (int i=1; i<=groupNum[0]; i++) plain[groupNum[i]] = groupChar[i]; cout<<plain<<endl; } return 0; }