考试完后过了这么久,来发福利了攒人品了~~~
大家可以在poj地址http://bailian.openjudge.cn/tm201401/找到所有试题,并可以在百练中搜索相应试题自己练习。
A:单词排序
总时间限制: 1000ms 内存限制: 65536kB
描述
输入一行单词序列,相邻单词之间由1个或多个空格间隔,请按照字母顺序输出这些单词(即按照字符串中字母的ASCII码排序,区分大小写,当首字母相同时,比较第2个字母,依次类推),要求重复的单词只输出一次。
输入
一行单词序列,最少1个单词,最多100个单词,每个单词长度不超过50,单词之间用至少1个空格间隔。
输出
按字母顺序输出这些单词,重复的单词只输出一次。
样例输入
She wants to go to Peking University to study Chinese
样例输出
Chinese
Peking
She
University
go
study
to
wants
本题首先注意到题目所说最多100个单词,每个单词长度不超过50,所以只用开[100][51]的二维char数组就行了。
这题看到这个数据规模,所以考虑直接用最简单的插入排序,插入排序所需耗费的比较次数最多是(100^2)*50,即小于50W次比较可以得到答案,所以最简单的插入排序即可以满足该题的1000ms需求,我的代码在下面,大家可以参考一下。
提示:如果数据规模在大一些,对时间要求稍微严格一些的话,这道题明显可以用trie树来解,即最开始根据题目读取单词并简历trie树,O(n)复杂度,最后深度优先遍历一遍trie树,输出trie树中所存字符串结果O(n)。所以,这样的时间复杂度只有O(n),大大优化了上面的简单算法。
#include <iostream> #include <stdio.h> #include <cstring> #include <algorithm> using namespace std; char s[101][51]={0}; int work(char* a,char *b) { int i = 0; for( i=0;a[i]!='