链接:
https://cn.vjudge.net/problem/1160064/origin
题意:
先给出e或者d。e表示加密,d表示解密。
加密的过程:
空格为零,a—z用1—26表示。
这样字符串s先转换成v[]数组,然后求数组u,u[i]表示的v的前缀和。
对u数组的每个数据27取余化简。
根据最开始的映射关系输出字符串。
解密过程:
与加密相反即可,求u时,需要注意所求的数组是非递减的(因为是前缀和嘛),具体看代码吧。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3+10;
int sum[maxn],num[maxn];
int main()
{
int t;
char op;
string s;
for(cin>>t; t--;)
{
memset(sum,0,sizeof sum);
memset(num,0,sizeof num);
cin>>op;
getchar();
getline(cin,s);
int len = s.length();
if(op=='e')
{
for(int i = 0; i < len; i++)
{
if(s[i] == ' ')
sum[i] = 0;
else
sum[i] = s[i] - 'a' + 1;
}
for(int i = 1 ; i < len ;i++)
{
sum[i] = (sum[i] + sum[i-1]) % 27;
}
for(int i = 0 ; i < len; i++)
{
if(sum[i] == 0)
cout<<' ';
else
cout<<(char) (sum[i] - 1 + 'a');
}
}
else
{
for(int i = 0 ; i < len ; i++)
{
if(s[i] == ' ')
sum[i] = 0;
else
sum[i] = s[i] - 'a' + 1;
}
for(int i = 1; i < len ; i++ )//加法对取余无影响
{
num[i] = num[i-1] +sum[i-1];
while(sum[i] < num[i]) sum[i] += 27;
sum[i] = (sum[i] - num[i]) % 27;
}
for(int i = 0; i < len; i++)
{
if(sum[i] == 0 )
cout<<' ';
else
cout<<(char)(sum[i]-1+'a');
}
}
cout<<endl;
}
return 0;
}