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;
}
}