HDU 2072 单词数

单词数

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12939    Accepted Submission(s): 3310


Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
 

 

Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
 

 

Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
 

 

Sample Input
you are my friend #
 

 

Sample Output
4
 
 
 
 
 
 
 
这次我第一次对每一个字符处理。
代码如此:
View Code
 1 #include<stdio.h>
2 #include<string.h>
3 int main()
4 {
5 char c,str[1000][1000],flag = 0,count;
6 int x,y,i,j;
7
8 while(1)
9 {
10 x = 0;
11 y = 0;
12 while((c = getchar() )!= '\n')
13 {
14 if (c == '#')
15 {
16 flag = 1;
17 break;
18 }
19 if (c != ' ')
20 {
21 str[x][y++] = c;
22 }
23 else
24 {
25 str[x][y] = '\0';
26 y = 0;
27 x++;
28 }
29 }
30
31 if(flag)
32 {
33 break;
34 }
35 str[x][y] = '\0';
36 count = 0;
37 for (i = 0;i <= x;i++)
38 {
39 if(str[i][0])
40 {
41 count++;
42 for(j = i + 1;j <= x;j++)
43 {
44 if(strcmp(str[i],str[j]) == 0)
45 {
46 str[j][0] = '\0';
47 }
48 }
49 }
50 }
51 printf("%d\n",count);
52 }
53
54 return 0;
55 }


 1 #include<stdio.h>
2 #include<string.h>
3 int main()
4 {
5     char c,str[1000][1000],flag = 0,count;
6     int x,y,i,j;
7
8     while(1)
9     {
10         x = 0;
11         y = 0;
12         while((c = getchar() )!= '\n')
13         {
14             if (c == '#')
15             {
16                 flag = 1;
17                 break;
18             }
19             if (c != ' ')
20             {
21                 str[x][y++] = c;
22             }
23             else
24             {
25                 str[x][y] = '\0';
26                 y = 0;
27                 x++;
28             }
29         }
30         
31         if(flag)
32         {
33             break;
34         }
35         str[x][y] = '\0';
36         count = 0;
37         for (i = 0;i <= x;i++)
38         {
39             if(str[i][0])
40             {
41                 count++;
42                 for(j = i + 1;j <= x;j++)
43                 {
44                     if(strcmp(str[i],str[j]) == 0)
45                     {
46                         str[j][0] = '\0';
47                     }
48                 }
49             }
50         }
51         printf("%d\n",count);
52     }
53     
54     return 0;
55 }
 
对STL不太了解,这里有个用STL做的代码。。先留下,以后慢慢学习。
View Code
 1 #include<iostream>  
2 #include<set>
3 #include<string>
4 #include<sstream>
5 using namespace std;
6 int main()
7 {
8 string art;
9 while(getline(cin,art) && art != "#"){
10 istringstream stream(art);
11 string word;
12 set<string> map;
13 while(stream >>word){
14 //cout <<word <<" ";
15 map.insert(word);
16 }
17 cout <<map.size() <<endl;
18 }
19 return 0;
20 }
 
 
看了人家的报告后,学了点东西。1~#include<string.h>里的strtok()函数。这个我另外写一篇。介绍。(取由某字符串分隔的串)
2~计算不同类的总数的方法。
以前我是先排序,指向第一个元素,count = 1,向后指,当当前元素与前一个元素不同时count++.
 
 
而人家是,用另外一个数组y[0....l],存不同类的元素,l  记录长度,开始l = 0;  对于每个元素都要把数组y[0...l]扫完。若发现相同就break;,扫完都没相同,新增一个不同的类,y[l] = 新的一类。l++;
最后的 l 就是不同类的总数了。看代码。
View Code
 1 #include<stdio.h> 
2 #include<string.h>
3
4 char y[1000][100];
5 char x[20001],t[100];
6 int main()
7 {
8 int i,j,k,l;
9 char *p,*q;
10 while(gets(x))
11 {
12 if(strcmp(x,"#")==0) break;
13 l=0;
14 p=x;
15 q=strtok(p," "); //第一次用是p,以后是NULL
16 while(q)
17 {
18 strcpy(t,q);
19 for(i=0;i<l;i++)//上面说的计算不同类的总数。
20 {
21 if(strcmp(y[i],t)==0)
22 break;
23 }
24 if(i==l)
25 {
26 strcpy(y[i],t);
27 l++;
28 }
29 q=strtok(NULL," ");
30 }
31
32 printf("%d\n",l);
33 }
34 return 0;
35 }

posted on 2012-01-16 10:55  [S*I]SImMon_WCG______*  阅读(1061)  评论(0编辑  收藏  举报

导航