/*
自己已经有了很大体的思路,但感觉很麻烦、可能超时,于是百度了。我的想法是,判断单词、转小写,存入,每存入一个单词前判断该单词与已存入单词(即字典)比较,但这样牵涉到新单词的位置问题,用顺序表存的话,每次都要移动排在新单词之后的所有单词。感觉这个想法比较麻烦,可能超时。
另一想法是,把所有单词先存下来,再进行排序,然后去重。(这样需要估计最大的单词数,我觉得是500 000。去重的过程我想的比较麻烦,复杂度好像是1+2+3+...(当然,如果结合最终的思路,去重的过程可以更简单的),然后我给优化成第一种思路了。。。)
**参考后的思路:把所有单词存下来,排序,进行输出,输出时对每个i进行相邻是否重复判断。(这个思路真的很好,我想大部分ACMer都能想到这个思路吧,无奈我是个菜鸟~ 感觉这个思路和那个输出a和b交换后的值有异曲同工之妙~)
总结:这里我还有个错误,就是用strlen求二维数组的行数。首先strlen是字符串函数,这里用在二维数组好像不合适,而且二维数组最后一行没有\n,这个应该有点概念混淆了吧。第二,行数其实是知道的。
*/
Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
//#define LOCAL
int compare(const void* _a, const void* _b);
char word[500010][220];
int main()
{
#ifdef LOCAL
freopen("data10815.in","r",stdin);
freopen("data10815.out","w",stdout);
#endif
char c;
int n=0,j=0;
while((c=getchar())!=EOF)
{
if(isalpha(c))
{
word[n][j++]=tolower(c);
}
else
{
word[n][j]='\0';
j=0;
++n;
}
}//while
qsort(word,n,sizeof(word[0]),compare);
for(int i=0;i<n-1;++i)
{
if(strcmp(word[i],word[i+1]) && word[i][0]!='\0')
printf("%s\n",word[i]);
}
printf("%s\n",word[n-1]);//额,这里是有\n的
//system("pause");
return 0;
}
int compare(const void* _a, const void* _b)
{
char* a=(char *)_a;
char* b=(char *)_b;
return strcmp(a,b);
}