STL应用-——小安的字典set时间限制:
3 Sec 内存限制: 128 M
题目描述
小安很喜欢英语,她渴望有一本自己独特的字典,但写一本字典并不容易,所以她想出了一个办法:从她最喜欢的一本书中挑出所有不同的单词,按照字典序排列一下就完成了字典的雏形啦。可是,这是一个很大的工程量,为了不让妹子失望,你打算写个程序来完成她的梦想。
你的程序要求按字典序列举出给定输入文本中的所有单词,这个问题中,一个单词的定义是一连串大写或小写字母,单词也可能只有一个字母。同时你还要注意大小写问题,比如“Apple”,“apple” 或 “APPLE”是一样的。
输入
输入不超过5000行的文本(英文),每行不超过200个字母,输入以EOF终止
输出
输出文本中出现的不同单词的列表,按字典序排列,一行一个单词,并且都是小写,可以确定的是文本中的单词不超过5000个。
样例输入
Adventures in Disneyland
Two blondes were going to Disneyland when they came to a fork in the road. The sign read: "Disneyland Left."
So they went home.
样例输出
a
adventures
blondes
came
disneyland
fork
going
home
in
left
read
road
sign
so
the
they
to
two
went
were
when
提示
常规思路可能是 排序 + 分离单词技巧来模拟这个过程,实际上我们有好用的STL容器set能自动帮我们完成字典序排序和去重的过程,当然,巧妙地读入方式以及某些函数可能也会很大程度上减小代码量。
#include<iostream>
#include<cstring>
#include<set>
#include<cstdio>
using namespace std;
int c='a'-'A';
int main()
{
char jieshou;
string jieguo,zhongzhuan;
set<string> a;
cin.tie(0);
while((jieshou=getchar())!=EOF) //读入每一个字符
{
if(jieshou>='a'&&jieshou<='z') //把每一个单个字母拼接为一个单词,在用字符串拼接时要注意到相加的先后顺序。
{
zhongzhuan=zhongzhuan+jieshou;
}
else if(jieshou>='A'&&jieshou<='Z') //在字符拼接过程中的大小写转换。
{
jieshou=jieshou+c;
zhongzhuan=zhongzhuan+jieshou;
}
else //遇到不是字母的字符就把已拼接的单词插入SET当中,SET会自动的排好顺序。
{
a.insert(zhongzhuan);
zhongzhuan=jieguo;
}
}
set<string>::iterator b;
for(b=a.begin();b!=a.end();b++) //但是需要注意的是,用getchar接受字符时会把换行符读入,我写的程序中,回车只读入了一个,且在当中被排到了第一的位置,所以
{
if(b==a.begin()) //要用b++来不输出这个换行符,也可能是读入了多个换行符,但SET将其去重了。,
{
b++;
}
cout<<*b<<endl;
}
return 0;
}
其它的博主有这题的英文原版题解。