ACM STL应用-——小安的字典set

来源:互联网 发布:2017淘宝司法拍卖房产 编辑:程序博客网 时间:2024/05/16 06:59

原题链接:

          http://newoj.acmclub.cn/problems/1690

题目描述:

小安很喜欢英语,她渴望有一本自己独特的字典,但写一本字典并不容易,所以她想出了一个办法:从她最喜欢的一本书中挑出所有不同的单词,按照字典序排列一下就完成了字典的雏形啦。可是,这是一个很大的工程量,为了不让妹子失望,你打算写个程序来完成她的梦想。

你的程序要求按字典序列举出给定输入文本中的所有单词,这个问题中,一个单词的定义是一连串大写或小写字母,单词也可能只有一个字母。同时你还要注意大小写问题,比如“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

解题思路:

        在这个过程中,需要一个一个字符的接收数据,使用getchar()函数,直到接收到的数据为EOF为止,windows下的EOF就是新行按下ctrl+z,

        判断接收到的是不是字母,如果是小写字母的话,就直接连接到一个字符串上,如果是大写字母的话,就先转换成小写字母,再连接到字符串上,

        如果不是字母的话,就将字符串插入到set中,并将字符串初始化为"".

        需要注意的是,set中的第一个元素是"",所以要从第二个元素开始遍历。

        原因:“”的ascii值要比字母的小,而且在程序运行过程中将字符串初始化成了"",如果下一个字符不是字母的话,那“”就会被插入到set中

代码:

      

#include <bits/stdc++.h>//大小写字母的转换 大写字母+32=小写字母  小写字母-32=大写字母 using namespace std;int main(){set<string> s1;set<string>::iterator t1,t2;char s2;    string s3;   while((s2=getchar()) != EOF){      if(s2 >= 'a'&&s2 <= 'z'){    s3=s3+s2;   }else if(s2 >= 'A'&&s2 <= 'Z'){ s2+=32; s3=s3+s2; //cout<<s3<<endl;} else{ //cout<<s3<<endl;s1.insert(s3);//set集合中不允许有重复元素,所以这样存储是不会出现问题的 s3="";//cout<<s3;}   }  // cout<<"yes";  // int count=s1.size();   //cout<<count;   t1 = s1.begin();   t2 = s1.end();   for(t1 = ++t1;t1 != t2;t1++)    cout<<*t1<<endl; return 0;}

原创粉丝点击