HDU 2072 字符串处理(判重)

来源:互联网 发布:知乎搞笑问题 编辑:程序博客网 时间:2024/05/16 19:21

单词数

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


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

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

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

Sample Input
you are my friend#
 

Sample Output
4
 
http://acm.hdu.edu.cn/showproblem.php?pid=2072

分析:对字符串进行处理,相同的判重,不同的加入集合,计算集合的大小,就知道一共有多少个不同的字符串了。

这道题的坑爹之处在于空格,前面可能有多个空格,后面可能有多个空格,单词之间可能有多个空格,要对多余的空格进行处理

下面给一些测试用例:

input:

kkkkk

            
    kdfghar    kecc     
 k   y   o 
     k
#


output:

1

0

0

2

3

1


#include<iostream>#include<string>#include<map>#include<vector>#include<cstdio>using namespace std;#define maxn 1000#define LOCALchar res[maxn][100];char tot[maxn];char temp[100];int main() {#ifdef LOCALfreopen("ACMinput.txt", "r", stdin);#endifwhile (cin.getline(tot, maxn)) {if (tot[0] == '#') break;int pos = 0;int len = strlen(tot);while (tot[pos] == ' ') pos++;//处理前导空格int j, i = 0;while (pos < len) {sscanf(tot+pos, "%s", temp);for (j = 0; j < i; j++)if (strcmp(res[j], temp) == 0) //对字符串进行判重break;if (j == i) strcpy(res[i++], temp);//不与之前的相同,则可以加入pos += strlen(temp)+1;while (tot[pos] == ' ') pos++;//处理中间的空格}cout << i << endl;}return 0;}


STL版(非常简洁,别人基本把工作做好了,直接引用就好了,初学建议自己多练习不要过分依赖库)


#include<iostream>#include<string>#include<map>#include<vector>#include<set>#include<cstdio>#include<sstream>using namespace std;#define maxn 1000#define LOCALstring tot;string temp;set<string> Set;int main() {#ifdef LOCALfreopen("ACMinput.txt", "r", stdin);#endifwhile (getline(cin, tot) && tot != "#") {Set.clear();stringstream str(tot);while (str >> temp)Set.insert(temp);cout << Set.size() << endl;}return 0;}


0 0
原创粉丝点击