标签:
Time Limit: 3000MS | Memory Limit: Unknown | 64bit IO Format: %lld & %llu |
Description
Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still used in international radio communication. The coding of text using Morse code is straightforward. Each character (case is insignificant) is translated to a predefined sequence of dits and dahs (the elements of Morse code). Dits are represented as periods (``.‘‘) and dahs are represented as hyphens or minus signs (``-‘‘). Each element is transmitted by sending a signal for some period of time. A dit is rather short, and a dah is, in perfectly formed code, three times as long as a dit. A short silent space appears between elements, with a longer space between characters. A still longer space separates words. This dependence on the spacing and timing of elements means that Morse code operators sometimes do not send perfect code. This results in difficulties for the receiving operator, but frequently the message can be decoded depending on context.
In this problem we consider reception of words in Morse code without spacing between letters. Without the spacing, it is possible for multiple words to be coded the same. For example, if the message ``dit dit dit‘‘ were received, it could be interpreted as
``EEE‘‘, ``EI‘‘, ``IE‘‘ or ``S‘‘ based on the coding scheme shown in the sample input. To decide between these multiple interpretations, we assume a particular context by expecting each received word to appear in a dictionary.
For this problem your program will read a table giving the encoding of letters and digits into Morse code, a list of expected words (context), and a sequence of words encoded in Morse code (morse). These morse words may be flawed. For each morse word,
your program is to determine the matching word from context, if any. If multiple words from context match morse, or if no word matches perfectly, your program will display the best
matching word and a mismatch indicator.
If a single word from context matches morse perfectly, it will be displayed on a single line, by itself. If multiple context words exist for
a given morse, the first matching word will be displayed followed by an exclamation point (``!‘‘).
We assume only a simple case of errors in transmission in which elements may be either truncated from the end of a morse word or added to the end of a morse word. When no perfect matches
for morse are found, display the word from context that matches the longest prefix ofmorse, or has the fewest extra elements beyond those in morse. If multiple
words in context match using these rules, any of these matches may be displayed. Words that do not match perfectly are displayed with a question mark (``?‘‘) suffixed.
The input data will only contain cases that fall within the preceding rules.
The context section appears next, with one word per line, possibly preceded and followed by blanks. Each word in context will contain no more than ten characters. No characters other than
upper case letters and digits will appear. Thered will be at most 100 context words. A line containing only a single asterisk (``*‘‘), possibly preceded or followed by blanks, terminates the context section.
The remainder of the input contains morse words separated by blanks or end-of-line characters. A line containing only a single asterisk (``*‘‘), possibly preceded or followed by blanks, terminates the input. No morse word
will have more than eighty (80) elements.
A .- B -... C -.-. D -.. E . F ..-. G --. H .... I .. J .--- K -.- L .-.. M -- N -. O --- P .--. Q --.- R .-. S ... T - U ..- V ...- W .-- X -..- Y -.-- Z --.. 0 ------ 1 .----- 2 ..--- 3 ...-- 4 ....- 5 ..... 6 -.... 7 --... 8 ---.. 9 ----. * AN EARTHQUAKE EAT GOD HATH IM READY TO WHAT WROTH * .--.....-- .....--.... --.----.. .--.-.----.. .--.....-- .--. ..-.-.-....--.-..-.--.-. ..-- .-...--..-.-- ---- ..-- *
WHAT HATH GOD WROTH? WHAT AN EARTHQUAKE EAT! READY TO EAT!
对于多个精确匹配的, 输出字典序最小的和“!”。模糊匹配, 要输出匹配程度最高的(应该是吧……反正没什么害处)和“?”。用STL的话就很简单了,难一点的地方在模糊匹配的处理,其实也还好。有写注释,看代码吧。
#include<iostream> #include<cstring> #include<string> #include<map> #include<iterator> using namespace std; map<char, string>code; //code数组存字母及其对应的莫尔斯电码 map<string, string>dict; //dict数组存单词及其对应的电码序列 int main() { char c; string cc; while (cin >> c&&c != '*') //存字母的莫尔斯电码 { cin >> cc; code[c] = cc; } /* map<char, string>::iterator it; for (it = code.begin(); it != code.end(); it++) cout << it->first << " " << it->second << endl; */ string word; //存单词的电码序列 while (cin >> word && word!="*") { string temp=""; for (int i = 0; word[i]; i++) temp = temp + code[word[i]]; dict[word] = temp; } /* map<string, string>::iterator it; for (it = dict.begin(); it != dict.end(); it++) cout << it->first << " " << it->second << endl; */ string s; while (cin >> s && s != "*") { int pipei = 0; map<string, string>::iterator it;//统计字典中有多少单词与这个电码序列匹配 for (it = dict.begin(); it != dict.end(); it++) { if (it->second == s) { if (!pipei) cout << it->first; pipei++; } } if (pipei > 1) cout << '!'; if (pipei == 0) //对不能精确匹配的序列特殊处理 { string ans; string a; string b; int d; int dis=10e6; //dis记录匹配程度(差几个字母) for (it = dict.begin(); it != dict.end(); it++) { a = it->second; b = s; if (b.size() < a.size()) swap(a, b); //substr函数返回0开始,长度为a串长度的副本 if (a == b.substr(0, a.size())) //短序列是长序列的子串 { d = b.size() - a.size(); if (d < dis) //遍历找打匹配程度最大的 { dis = d; ans = it->first; } } } cout << ans << '?'; } cout << endl; } }
标签:
原文地址:http://blog.csdn.net/qq_18738333/article/details/44972651