题:
-
总时间限制:1000ms 内存限制:65536kB
-
描述
-
A国和B国正在进行一场战争。A国通过间谍知道B国的情报加密规则为:
1. 仅对字母加密,其他符号保留(如空格,逗号等)
2. 对第i个单词(i从1开始)的加密方法是把第i个单词反转(如abc变成cba),然后对单词内的每个字母采用经典的Caesar加密法,循环后移i个字母。例如:第5个单词的加密表如下所示:
密码字母:A B C D E F G H I J K L M N O P Q R S T U VW X Y Z
原文字母:V W X Y Z A B C D E F G H I J K L M N O P QR S T U
3. 单词的定义是:任何一串极大的连续字母串。
比如,样例输出第三行,第二个单词为ba,反转后为ab,a后移2个单词变成c,b后移两个单词变成d,故该单词加密后为cd(见样例输入第三行)。
现在A国又截获了一些B国的情报密文。请你帮A国破译出情报的内容。
输入
- 一共有不超过int范围行,每行为一个字符串(int范围)。注意,每行是可以以空格开头的。 输出
- 情报破译后得到的内容。每条情报对应输出一行。 样例输入:
-
解:
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
void Tra(string A);
char Cc(int n,char c);
int main()
{
int Line=0;
int count=0;
int Len;
string A[65536];
/* while(true)
{
count++;
Len=0;
getline(cin,A[count-1]);
while(A[count-1][Len++]);
if(A[count-1][Len-2]!='.')
{
break;
}
}
for(int i=0;i<count;i++)
{
Tra(A[i]);
}
*/
for(int i=0;i<65536;i++)
{
count=i;
getline(cin,A[count]);
Tra(A[count]);
}
return 0;
}
void Tra(string A)
{
int F=-1;
int L=-1;
int InWord=0;
char Temp;
int Count=0;
int i=0;
while(A[i])
{
if(InWord==0&& ( ( A[i]>=97&&A[i]<=122) || (A[i]>=65&&A[i]<=90) ) )
{
InWord=1;
Count++;
F=i;
}
if(InWord==1&&( A[i]>122 || A[i]<65 || (A[i]>90&&A[i]<97) ) )
{InWord=0;
L=i;
}
if(InWord==1&&(A[i]<=122&&A[i]>=97||A[i]>=65&&A[i]<=90)&&A[i+1]==0)
{
InWord=0;
L=i+1;
}
if(F!=-1&&L!=-1)
{
for(int h=0;h<(L-F)/2;h++)
{
Temp=A[F+h];
A[F+h]=A[L-h-1];
A[L-h-1]=Temp;
}
for(int h=0;h<(L-F);h++)
{
A[F+h]=Cc(Count,A[F+h]);
}
F=-1;
L=-1;
}
i++;
}
cout<<A<<endl;
}
char Cc(int n,char c)
{
if(c>=97&&c<=122)
{
if(c-n>=97)
{
return c-n;
}
else
{
return 'z'-(96+n-c);
}
}
if(c>=65&&c<=90)
{
if(c-n>=65)
{
return c-n;
}
else
{
return 'Z'-(64+n-c);
}
}
}