单词数
Description
lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。
Input
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,遇到#时表示输入结束。
Output
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
Sample Input
you are my friend
#
Sample Output
4
set用法
本题处理空格和换行有点麻烦。要将每行的空格和换行过滤掉,然后将所有的字符串提取出来。
AC代码
#include<iostream>
#include<set>
#include<string>
using namespace std;
void solve(){
string s;
char c;
set<string> st;
while (c = getchar(), c != '#'){
s += c;
while (c != '\n'){
while(c = getchar(), c != ' ' && c != '\n'){
s += c;
}
if (s.size() != 0 && s != " ") st.insert(s);
s.clear();
}
printf("%d\n", st.size());
st.clear();
}
}
int main(){
solve();
return 0;
}
流的操作
AC代码
#include<cstdio>
#include<sstream>
#include<string>
#include<iostream>
#define IOS std::ios::sync_with_stdio(false)
using namespace std;
const int maxn = 2e6 + 5;
int tree[maxn][26];//i号结点有没有j字符的边。如果有存的是这个端点的编号
bool vis[maxn];
int k = 1, ans = 0;
void insert(string w, int len){
int u = 0;
for (int i = 0; i < len; ++i){
int v = w[i] - 'a';
if (!tree[u][v]){
tree[u][v] = k++;
}
u = tree[u][v];
}
if (!vis[u])
ans++;
vis[u] = true;
}
void init(){
for (int i = 1; i <= k; ++i){
vis[i] = false;
for (int j = 0; j < 26; ++j){
tree[i][j] = 0;
}
}
k = 1;
}
void solve(){
string buf, s;
while (getline(cin,buf), buf[0] != '#'){
ans = 0;
//流的输出操作,将buf按空格分割装入ss中,然后将ss用流输出到s中。
stringstream ss(buf);
while (ss >> s){
insert(s, s.size());
}
cout << ans << endl;
init();
}
}
int main(){
IOS;
solve();
return 0;
}
/**
you are my friend
sdasd asdasj asdj daslkd salkdj askdj
dsadjo sdiuh skjdl ajlskdj adlk ljaksdj
asjd kajlsd ajslkd alksj you askdkl you you
#
**/