题目链接:
http://poj.org/problem?id=1107
题目大意:
高级加密标准需要用到三个整数k1、k2、k3,然后把26个英文字母分为三组,字符[a~i]为一组,字符
[j~r]是第二组,其他字符[s~z]和下划线_组成第三组。在信息中属于每组的字符,在加密的时候,都被
循环的向左移ki个位置。每组的字符只在自己组中的字符构成的字符串中移动。现在给你加密过后的消
息,请输出原文信息。
思路:
解密的过程其实就是信息中属于每组的字符,都循环的向右移ki个位置。用字符数组s[]来存储加密信息,
s1[]来保存解密后的信息。统计每组字符的个数numi,如果不为0,就将他们右移ki%numi个位置,然后
存入s1[]数组中,最后输出s1[]。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
char s[110],s1[110];
int num[110];
void Rotate(int i,int k,int len)
{
int no = 0,j = i;
while(no != k)
{
j++;
if(j > len-1)
j = 0;
if(num[j] == num[i])
no++;
}
s1[j] = s[i];
}
int main()
{
int k1,k2,k3,num1,num2,num3;
while(~scanf("%d%d%d",&k1,&k2,&k3) && (k1||k2||k3))
{
scanf("%s",s);
int len = strlen(s);
memset(num,0,sizeof(num));
memset(s1,0,sizeof(s1));
num1 = num2 = num3 = 0;
for(int i = 0; i < len; ++i)
{
if(s[i]>='a' && s[i]<='i')
{
num1++;
num[i] = 1;
}
else if(s[i]>='j' && s[i]<='r')
{
num2++;
num[i] = 2;
}
else
{
num3++;
num[i] = 3;
}
}
for(int i = 0; i < len; ++i)
{
if(num[i] == 1)
{
if(num1 != 0)
Rotate(i,k1%num1,len);
}
else if(num[i] == 2)
{
if(num2 != 0)
Rotate(i,k2%num2,len);
}
else
{
if(num3 != 0)
Rotate(i,k3%num3,len);
}
}
s1[len] = '\0';
printf("%s\n",s1);
}
return 0;
}
原文:http://blog.csdn.net/lianai911/article/details/44679671