题目大意:
如图所示为A-Z26个字母的Morse code(莫尔斯电码)
每个编码都由1-4个.或-字符组成,当然了,用数学计算,一个的有两种E和T,两个的有四种,三个的有八种,四个的有十六种,这样总共有三十种编码,而剩下的四种用来表示四个标点符号underscore”_”,period”.”,comma”,”,question mark”?”
M.E. Ohaver 提出了一种加密方式,把信息的莫尔斯电码写出来,然后根据每个字符的莫尔斯电码的位数组成一串字数数列,然后将此数列翻转,再在信息的莫尔斯电码里按照位数依次查找,将对应位置对应长度的莫尔斯电码表示的字符写出来就变成了密文,example:AC的莫尔斯电码为.–.-.对应长度序列为24,将此数列翻转为42,则按照此数字序列取莫尔斯电码,AC的译码为P(.–.)N(-.)由此我们也可以知道这种简单的加密方式是可逆的,也就是用同样的方法把得到的密文再加密就是原文,相当于^运算。
解题思路:
模拟题
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct
{
char code[5];
}no;
no node[30];
int count=0,l;
char string[120];
void init()
{
strcpy(node[0].code,".-");
strcpy(node[1].code,"-...");
strcpy(node[2].code,"-.-.");
strcpy(node[3].code,"-..");
strcpy(node[4].code,".");
strcpy(node[5].code,"..-.");
strcpy(node[6].code,"--.");
strcpy(node[7].code,"....");
strcpy(node[8].code,"..");
strcpy(node[9].code,".---");
strcpy(node[10].code,"-.-");
strcpy(node[11].code,".-..");
strcpy(node[12].code,"--");
strcpy(node[13].code,"-.");
strcpy(node[14].code,"---");
strcpy(node[15].code,".--.");
strcpy(node[16].code,"--.-");
strcpy(node[17].code,".-.");
strcpy(node[18].code,"...");
strcpy(node[19].code,"-");
strcpy(node[20].code,"..-");
strcpy(node[21].code,"...-");
strcpy(node[22].code,".--");
strcpy(node[23].code,"-..-");
strcpy(node[24].code,"-.--");
strcpy(node[25].code,"--..");
strcpy(node[26].code,"..--");
strcpy(node[27].code,".-.-");
strcpy(node[28].code,"---.");
strcpy(node[29].code,"----");
}
void program()
{
char morse[500];
int number[200];
int i,j=0,len=0;
for(i=0;i<l;i++)
{
if(string[i]>='A'&&string[i]<='Z')
{
strcpy(morse+len,node[string[i]-'A'].code);
len=len+strlen(node[string[i]-'A'].code);
number[j++]=strlen(node[string[i]-'A'].code);
}
else if(string[i]=='_')
{
strcpy(morse+len,node[26].code);
len=len+strlen(node[26].code);
number[j++]=strlen(node[26].code);
}
else if(string[i]==',')
{
strcpy(morse+len,node[27].code);
len=len+strlen(node[27].code);
number[j++]=strlen(node[27].code);
}
else if(string[i]=='.')
{
strcpy(morse+len,node[28].code);
len=len+strlen(node[28].code);
number[j++]=strlen(node[28].code);
}
else if(string[i]=='?')
{
strcpy(morse+len,node[29].code);
len=len+strlen(node[29].code);
number[j++]=strlen(node[29].code);
}
}
morse[len]=0;
for(i=0;i<=j/2-1;i++)
{
int temp;
temp=number[j-1-i];
number[j-1-i]=number[i];
number[i]=temp;
}
int point=0;len=j;
printf("%d: ",++count);
for(i=0;i<len;i++)
{
char temp[5];
for(j=0;j<number[i];j++)
{
temp[j]=morse[point+j];
}
temp[number[i]]=0;
point=point+number[i];
for(j=0;j<30;j++)
{
if(!strcmp(node[j].code,temp))
{
if(j==26)
{
printf("_");
}
else if(j==27)
{
printf(",");
}
else if(j==28)
{
printf(".");
}
else if(j==29)
{
printf("?");
}
else
{
char c='A'+j;
printf("%c",c);
}
}
}
}
printf("\n");
}
int main()
{
int n,i;
scanf("%d",&n);
init();
while(n--)
{
scanf("%s",string);
l=strlen(string);
program();
}
return 0;
}