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