uva508 莫尔斯电码(Morse Mismatches)

  1. 首先我理解错了题意,在这篇文章找到了UVa 508 Morse Mismatches(莫尔斯电码)
    这题的意思是给定一些莫尔斯编码,给定一些已知字典,给定一些编码,求解这些编码的对应原文,如果可以精确匹配,则直接输出原单词,如果有多个可精确匹配的结果,则输出匹配结果里字典序最小的单词(紫书上说输出任意一个,这是错误的)并在末位加上“!”;如果无法精确匹配,则可以在编码的末尾增加或删除一些字符后匹配单词(增删应尽量小,就是找到增删最少的模糊匹配),无论增删后匹配一个还是多个,最后都要加上“?”,如果有多个模糊匹配结果(增删数相等),则输出字典序最小的匹配结果;如果无精确匹配也无模糊匹配结果,则输出整个给定字典里字典序最小的那个单词。
  2. 其次我把数组设得太小 char word[12],不过在调试过程中学到了很多东西,倒是错得值得。下面列出
  3. strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
  4. std::ios::sync_with_stdio(false);
    原来而cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入输出缓存,可以节省许多时间,使效率与scanf与printf相差无几,还有应注意的是scanf与printf使用的头文件应是stdio.h而不是iostream。
    我沒有使用这句。
// uva508.cpp
#include 
#include 
#include 
char table[40][10];
struct context {
    char word[20];  // 12 is too small
    char code[100];
    bool operator < (const context y) const {
        return strcmp(word, y.word) < 0;
    }
} words[110];

int main(){
    char c; 
    memset(table, '\0', sizeof(table));
    for(;;){
        scanf("%s", &c);  // %c will input the '\n', result in endless loop
        if (c == '*') break;
        if (c >= 'A' && c <= 'Z') scanf("%s", table[c - 'A']);
        else scanf("%s", table[c - '0' + 26]);
    }

    int n_words = 0;
    memset(words, '\0', sizeof(words));
    for (;;){
        scanf("%s", words[n_words].word);
        if (words[n_words].word[0] == '*') break; // ok
        int len = strlen(words[n_words].word);
        for (int i = 0; i < len; i++){
            char word = words[n_words].word[i]; // translate the word to morse code
            int q; 
            if (word >= 'A' && word <= 'Z') q = word - 'A';
            else q = word - '0' + 26;
            strcat(words[n_words].code, table[q]);
        }
        n_words++;
    }
    std::sort(words, words + n_words);
    char str[81];
    for (;;){
        scanf("%s", str);
        if (str[0] == '*') break;
        int p_word = 0, diff = 81, num = 0, len_str = strlen(str);
        for (int i = 0; i < n_words; i++){
            int len_code = strlen(words[i].code);
            if (len_str <= len_code){
                if (strstr(words[i].code, str) == words[i].code){
                    if (len_code - len_str < diff){
                        p_word = i;
                        diff = len_code - len_str;
                        num = 1;
                    }
                    else if (len_code - len_str == diff) num++;
                }
            }
            else {
                if (strstr(str, words[i].code) == str){
                    if (len_str - len_code < diff){
                        p_word = i;
                        diff = len_str - len_code;
                        num = 1;
                    }
                    else if (len_str - len_code == diff) num++;
                }
            }
        }
        printf("%s", words[p_word].word);
        if (diff == 0 && num > 1) putchar('!');
        else if (diff != 0 ) putchar('?');
        putchar('\n');
    }
    return 0;
}

你可能感兴趣的:(成长日志,uva)