uva508

紫书上描述有问题,如果有多个精确匹配的, 要输出字典序最小的, 这里因为他给的序列就是按字典序排好的, 所以输出第一个精确匹配的。这道题,wa了两次在算模糊匹配的时候,考虑不周全,代码注释部分就是,模糊匹配,要么增加编码,要么减少编码,不够的话就算匹配不上,第一次没考虑这点,所以wa了。

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

char digit[11][10], letter[27][10], words[105][30], wordsMap[105][90];
int n;

void getMorseTable() 
{
    memset(digit, 0, sizeof(digit));
    memset(letter, 0, sizeof(letter));
    int i = 0;
    char str[30];
    while (cin >> str) {
        if (str[0] == '*') {
            break;
        }
        if (str[0] >= 'A'&&str[0] <= 'Z') {
            i = str[0] - 'A';
            cin >> letter[i];
        }
        else if (str[0] >= '0'&&str[0] <= '9') {
            i = str[0] - '0';
            cin >> digit[i];
        }
    }
}

void getContext()
{
    n = 0;
    memset(words, 0, sizeof(words));
    memset(wordsMap, 0, sizeof(wordsMap));
    while (cin >> words[n]) {
        if (words[n][0] == '*') {
            words[n][0] = '';
            break;
        }
        int temp = 0;
        for (int i = 0; i < strlen(words[n]); i++) {
            int flag;
            if (words[n][i] >= 'A'&&words[n][i] <= 'Z') {
                flag = words[n][i] - 'A';
                for (int j = 0; j < strlen(letter[flag]); j++) {
                    wordsMap[n][temp++] = letter[flag][j];
                }
            }
            else if (words[n][i] >= '0'&&words[n][i] <= '9') {
                flag = words[n][i] - '0';
                for (int j = 0; j < strlen(digit[flag]); j++) {
                    wordsMap[n][temp++] = digit[flag][j];
                }
            }
        }
        n++;
    }
}

void decode()
{
    char str[110];
    int res, matches, offset;
    int i, j;
    while (cin >> str) {
        res = 0; matches = 0; offset = 110;
        if (str[0] == '*')break;
        int off = 0;
        for (i = 0; i < n; i++) {
            for (j = 0; j < strlen(str), j < strlen(wordsMap[i]); j++) {
                if (str[j] != wordsMap[i][j])break;
            }
            //off = (strlen(str)-j) > (strlen(wordsMap[i])-j) ? (strlen(str) - j) : (strlen(wordsMap[i]) - j);
            if (strlen(str)==j&& strlen(wordsMap[i])==j) {
                /*if (matches) {
                    if (strcmp(wordsMap[res], wordsMap[i]) > 0) {
                        res = i;
                    }
                }
                else {
                    res = i;
                }*/
                if (!matches)res = i;
                matches++;
            }
            else {
                if (matches)continue;
                int min_len = min(strlen(str), strlen(wordsMap[i]));
                int max_len = max(strlen(str), strlen(wordsMap[i]));
                if (j==min_len&&max_len-min_len<offset) {
                    res = i;
                    offset = max_len - min_len;
                }
                /*else if (offset == off) {
                    if (strcmp(wordsMap[res], wordsMap[i]) > 0) {
                        res = i;
                    }
                }*/
            }
        }
        if (matches == 0) {
            cout << words[res] << '?' << endl;
        }
        else if (matches == 1) {
            cout << words[res] << endl;
        }
        else if (matches > 1) {
            cout << words[res] << '!' << endl;
        }
    }
}

int main()
{
    getMorseTable();
    getContext();
    decode();
    return 0;
}
原文地址:https://www.cnblogs.com/ArvinShaffer/p/9067853.html