hdu 1113 Word Amalgamation 解题报告
2013-07-31 22:02
375 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1113
题意:输入一个字典,然后再输入若干单词(每行中,1 <= 单词数 <= 100,并且每个单词在字典中保证是唯一的),用XXXXXX结尾来表示字典的结束。接着输入一个单词word(1 <= 字母个数 <= 6),每个单词你都需要在字典中找出所有可以用word的字母重排后得到的单词,并按照字典序从小到大的顺序在一行中输出;如果不存在,则输出“NOT A VALID WORD”。注意:字典中的单词不一定要按字典序顺序排列,但可以用word的字母重排后得到的单词必须要按字典序排列。
这里参考了《算法竞赛入门经典》中的例题:字母重排 来做的,自以为看懂后能快速地写出来,但是发现好几个bug。这就是实践的重要性啊,不过还是很欣喜地通过这题学会了qsort函数(要包含头文件stdlib.h)的用法(
http://baike.baidu.com/view/982231.htm)还有关于int cmp_string(const void *a,const void *b) 的理解(
http://hi.baidu.com/lyb1900/item/4698682bd85389fa51fd875c)
三个qsort处理后的结果如下(以样例数据为例):
样例数据:
tarp given score refund only trap work earn course pepper part
第一个: qsort(dic, n, sizeof(dic[0]), cmp_string);
course earn given only part pepper refund score tarp trap work
第二个: qsort(sorted[i], strlen(sorted[i]), sizeof(char), cmp_char);
ceorsu aenr eginv lnoy aprt eepppr defnru ceors aprt aprt korw
第三个: qsort(word, strlen(word), sizeof(char), cmp_char);
就是把输入的单词按字典序排序,比如输入nfudre,它就会变成defnru,然后比对回dic相应的位置,就能查出是refund这个单词了。
题意:输入一个字典,然后再输入若干单词(每行中,1 <= 单词数 <= 100,并且每个单词在字典中保证是唯一的),用XXXXXX结尾来表示字典的结束。接着输入一个单词word(1 <= 字母个数 <= 6),每个单词你都需要在字典中找出所有可以用word的字母重排后得到的单词,并按照字典序从小到大的顺序在一行中输出;如果不存在,则输出“NOT A VALID WORD”。注意:字典中的单词不一定要按字典序顺序排列,但可以用word的字母重排后得到的单词必须要按字典序排列。
这里参考了《算法竞赛入门经典》中的例题:字母重排 来做的,自以为看懂后能快速地写出来,但是发现好几个bug。这就是实践的重要性啊,不过还是很欣喜地通过这题学会了qsort函数(要包含头文件stdlib.h)的用法(
http://baike.baidu.com/view/982231.htm)还有关于int cmp_string(const void *a,const void *b) 的理解(
http://hi.baidu.com/lyb1900/item/4698682bd85389fa51fd875c)
三个qsort处理后的结果如下(以样例数据为例):
样例数据:
tarp given score refund only trap work earn course pepper part
第一个: qsort(dic, n, sizeof(dic[0]), cmp_string);
course earn given only part pepper refund score tarp trap work
第二个: qsort(sorted[i], strlen(sorted[i]), sizeof(char), cmp_char);
ceorsu aenr eginv lnoy aprt eepppr defnru ceors aprt aprt korw
第三个: qsort(word, strlen(word), sizeof(char), cmp_char);
就是把输入的单词按字典序排序,比如输入nfudre,它就会变成defnru,然后比对回dic相应的位置,就能查出是refund这个单词了。
#include <iostream> #include <string.h> #include <stdlib.h> using namespace std; char dic[105][10]; char sorted[105][10]; char word[10]; // 字符比较函数 int cmp_char(const void *_a, const void *_b) { char *a = (char *)_a; char *b = (char *)_b; return *a - *b; } // 字符串比较函数 int cmp_string(const void *_a, const void *_b) { char *a = (char *)_a; char *b = (char *)_b; return strcmp(a, b); } int main() { int i, n = 0; while (1) { scanf("%s", dic ); if (dic [0] == 'X') // 遇到结束标志就终止循环 break; n++; } qsort(dic, n, sizeof(dic[0]), cmp_string); // 给字典中所有单词排序(单词与单词之间) /* for (i = 0; i < n; i++) { cout << dic[i] << "\t"; } cout << endl; */ for (i = 0; i < n; i++) { // cout << dic[i] << '\t'; strcpy(sorted[i], dic[i]); // 字符串复制,注意不能直接用dic进行每个单词排序,否则会找不到字典中原有的单词 qsort(sorted[i], strlen(sorted[i]), sizeof(char), cmp_char); // 给每个单词排序(单词内部) // cout << sorted[i] << endl; } while (scanf("%s", word)) { int flag = 0; if (word[0] == 'X') break; qsort(word, strlen(word), sizeof(char), cmp_char); // 给输入单词排序 // cout << word << endl; for (i = 0; i < n; i++) { if (strcmp(sorted[i], word) == 0) { printf("%s\n", dic[i]); // 输出原始单词,而不是排序后的 flag = 1; } } if (!flag) printf("NOT A VALID WORD\n"); printf("******\n"); } return 0; }
相关文章推荐
- HDU 1113 Word Amalgamation -- 字符串处理+排序
- POJ 1318 && HDU 1113 Word Amalgamation(水~)
- HDU 1113 Word Amalgamation
- HDOJ HDU 1113 Word Amalgamation
- Word Amalgamation(poj1318) 解题报告
- hdu-----(1113)Word Amalgamation(字符串排序)
- HDU1113 Word Amalgamation
- hdu 1113 Word Amalgamation (map)
- hdu - 1113 Word Amalgamation (stl)
- HDU 1113 解题报告
- hdu1113 Word Amalgamation(详细解释--map和string的运用)
- HDU 1113 Word Amalgamation
- HDU 3732 Ahui Writes Word 解题报告
- HDU 1113 — Word Amalgamation
- HDU 1113--Word Amalgamation【map】
- HDU 1113 Word Amalgamation
- hdu 1113 Word Amalgamation
- hdu 1113 Word Amalgamation
- HDU 1113-Word Amalgamation
- hdu 1113 Word Amalgamation