您的位置:首页 > 其它

ZOJ1042

2016-01-25 12:23 246 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: