这个题呢,整体思路比较好想:开两个结构体,一个存放输入的指令(因为不一定按顺序排吗,所以得现搜索某个指令),另一个结构体存放输入的单词,最后开一个数组存放最后的电码。然后对每一个电码进行搜索,然后按照题目规定的输出方式输出。

    输出方式(题目细节):这个题也是看了好几遍,当完全看懂了之后(使劲查单词),再看课本,发现翻译的真是有点问题,总之输出方式呢,是如果有完美匹配的单词,就输出它本身,如果存在多个完美匹配,但有不相同的,那么输出第一个完美匹配的单词并且加上“!”。如果不能完美匹配,但是在指令后面能加减字符能凑出来的(也就是两个字符串相比,长度小的那个 长度范围内 都一样!就是一个是另一个的子字符串,(自己都说晕了。。)),这种情况,需要输出  添加字符数量最少的 那个单词并且加上 “?”,如果实在无法完美匹配(就是一个不是另一个的子字符串),那么根据原文输出字典序最小的并且加上“?”( display the word from context that matches the longest prefix of morse)!

其实我还是不理解它,最长的前缀,就是字典序最小吗?算了记住他吧!

总之  无法完美匹配的  一定要加“?”,精确匹配的如果没有不一样的,就输出本身,有不一样的输出本身加上“!”。

教训:需要细心读题,养成写变量的好习惯(如果变量名称写的不规范,并且行数非常多,查错误真的太难查了)

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define MAXN 1000 + 5
int long_pre;
struct codecvt
{
    char alpha[MAXN];
    char code[MAXN];
} code_tab[MAXN];
struct codet
{
    char tex[MAXN];
    int num_cont;
    char code[MAXN];
} code_tex[MAXN];
void store(char tex[],int num_tex,int num_code)
{
    int i,j,len = strlen(tex);
    for (i = 0; i < len; i++)
        for (j = 1; j < num_code; j++)
            if (tex[i] == code_tab[j].alpha[0])
                strcat(code_tex[num_tex].code,code_tab[j].code);
}
void Do(char code[MAXN][MAXN],int num_tex,int c_num,int num_morse_code)
{
    int i,j,cont = 0,is_print = 0,min2 = MAXN,min_index2 = 0;
    int distant = 0,min = MAXN,min_index = 0;
    for (i = 1; i < num_tex; i++)
    {
        if (strcmp(code[c_num],code_tex[i].code) == 0)
        {
            for (j = 1; j < num_tex; j++)
                if(strcmp(code_tex[j].code,code[c_num]) == 0)cont++;
            break;
        }
    }
    if (cont > 1)
    {
        printf("%s!\n",code_tex[i].tex);
        is_print = 1;
    }
    else if (cont == 1)
    {
        printf("%s\n",code_tex[i].tex);
        is_print = 1;
    }
    cont = 0;
    if (is_print)return;
    for (i = 1; i < num_tex; i++)
    {
        int len = strlen(code_tex[i].code) < strlen(code[c_num]) ? strlen(code_tex[i].code) : strlen(code[c_num]);
        for (j = 0; j < len; j++)
            if (code_tex[i].code[j] != code[c_num][j])distant++;
        if (distant == 0)
        {
            int len2 = strlen(code_tex[i].code) - strlen(code[c_num]);
            if (len2 < 0)len2 = -len2;
            if (len2 < min2)
            {
                min2 = len2;
                min_index2 = i;
            }
        }
        if (distant < min)
        {
            min = distant;
            min_index = i;
        }
        distant = 0;
    }
    if (min != 0)printf("%s?\n",code_tex[long_pre].tex);
    else printf("%s?\n",code_tex[min_index2].tex);
}
int main()
{
//    freopen("out.txt","w",stdout);
    int num_code = 1,num_tex = 1,i;
    while(1)
    {
        scanf("%s",code_tab[num_code].alpha);
        if (code_tab[num_code].alpha[0] == '*')break;
        scanf("%s",code_tab[num_code].code);
        num_code++;
    }
    long_pre = 1;
    while(1)
    {
        scanf("%s",code_tex[num_tex].tex);
        if (strcmp(code_tex[num_tex].tex ,"*") == 0)break;
        int len = strlen(code_tex[num_tex].tex);
        if (strcmp(code_tex[long_pre].tex,code_tex[num_tex].tex) > 0)
            long_pre = num_tex;
        code_tex[num_tex].num_cont = 0;
        store(code_tex[num_tex].tex,num_tex,num_code);    //  (array,number);
        num_tex++;
    }
    char code[MAXN][MAXN];
    int num_morse_code = 1;
    while(1)
    {
        scanf("%s",code[num_morse_code]);
        if (code[num_morse_code][0] == '*')break;
        num_morse_code++;
    }
    for (i = 1; i < num_morse_code; i++)
        Do(code,num_tex,i,num_morse_code);
    return 0;
}