UVa 10815 安迪的第一个字典

/*

        自己已经有了很大体的思路,但感觉很麻烦、可能超时,于是百度了。我的想法是,判断单词、转小写,存入,每存入一个单词前判断该单词与已存入单词(即字典)比较,但这样牵涉到新单词的位置问题,用顺序表存的话,每次都要移动排在新单词之后的所有单词。感觉这个想法比较麻烦,可能超时。

        另一想法是,把所有单词先存下来,再进行排序,然后去重。(这样需要估计最大的单词数,我觉得是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);   
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值