题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072
题目:
Problem Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
#
Sample Output
4
解题思路:这道题的思路就是计数每一行不同单词的个数,由此想到set关联式容器(是一个集合,集合中元素具有不重复性),set是C++标准库中的一种关联容器。所谓关联容器就是通过键(key)来读取和修改元素。与map关联容器不同,它只是单纯键的集合。此题通过cin.get()函数来读取单个字符,每次读取单词的第一个字符,接下来循环读入字符保存在s字符串中,判断条件为当前字符不是空格和换行符;当不满足条件即输入完一个单词,这样通过s.length()来检查是否单词长度为0,不为0就可向容器中插入该单词,最后如果遇到'
',即该组已经输入完毕,就得输出有多少个单词数了。
AC代码:
解法一:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 set<string>st;//一个保存string的set集合 6 string s; 7 char c; 8 while((c=cin.get())!='#'){//循环读入单词的第一个字符,直到不为'#'为止,控制文章 9 s.clear();//清除要保存单词的s字符串 10 while(c!=' '&&c!=' '){//循环读取字符(为一个单词) 11 s+=c; 12 c=cin.get();//获取下一个字符 13 } 14 if(s.length())//表示如果此时string中s是有长度,就将s插入到容器中 15 st.insert(s); 16 if(c==' '){//遇到' '的话就是该输出个数和换行了 17 cout<<st.size()<<endl;//输出容器的大小 18 st.clear();//清除st容器 19 } 20 } 21 return 0; 22 }
解法二:(C语言写法)
1 #include<bits/stdc++.h> 2 using namespace std; 3 char a[100001],b[2000][1000];//a数组要开大点,b数组用来保存每行的单词 4 int main() 5 { 6 int i,j,k,g,t; 7 while(gets(a)){ 8 if(strcmp(a,"#")==0)break; 9 memset(b,0,sizeof(b));//清空 10 i=j=k=0,g=strlen(a); 11 while(i<g){//扫描每行的字符串 12 if(a[i]==' '){ 13 while(a[i]==' '&&a[i]!='