算法竞赛入门经典第四章习题4-6 Morse Mismatches UVA - 508

https://vjudge.net/problem/UVA-508
题目不难,有几个坑点:
匹配分精确匹配,模糊匹配(一个字符串前缀和另一个字符串相同),不匹配
输出的是字典序最小的一个,看书上的中文题意拍是要无限wa

#include<iostream>
#include<string>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;
const int maxn = 100;
struct node {
    string s, mos;
    node(string a, string b) { s = a, mos = b; }
    node() = default;
};
int main() {
#ifdef _DEBUG
    freopen("in", "rb", stdin);
    //freopen("out", "wb", stdout);
#endif // _DEBUG
    string M[200];
    string s, t;
    node AA[maxn];
    int top = -1;
    while (cin >> s && s != "*")
        cin >> t, M[s[0]] = t;
    while (cin >> s && s != "*") {
        t = "";
        for (int i = 0; i < s.size(); ++i)
            t += M[s[i]];
        AA[++top] = node(s, t);
    }
    sort(AA, AA + top + 1, [](const node s, const node t) {return s.s < t.s; });
    while (cin >> s && s != "*") {
        int index = 0,dif = 99999,cnt=1;//dif为精确匹配为0,相差的字符,cnt为相同匹配个数
        for (int i = 0; i <= top; ++i) {
            int L = min(s.size(), AA[i].mos.size()),LL= s.size()+AA[i].mos.size()-L;
            int j;
            for (j = 0; j < L; ++j)
                if (s[j] != AA[i].mos[j]) break;
            if (j == L) {
                if (dif > LL-L) cnt = 1, dif = LL - L, index = i;
                else if (dif == LL - L) ++cnt;
            }
        }
        cout << AA[index].s;
        if (dif) cout << "?" << endl;
        else if (cnt > 1) cout << "!" << endl;
        else cout << endl;
    }
}   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值