一、题目
小明的一位同学是学霸,他的家中有很多藏书,真可谓汗牛充栋。小明想考一考学霸,给学霸出了一道难题。小明问这么多书籍,到底有多少本不一样的书,每样书的名字是什么?(因为有的书名是一样的,所以我们把它们视为同样的书)学霸就是学霸,张口就说出了答案。不知道你是否也是学霸?一起来挑战下!
输入格式
第一行是书籍总量n(1<=n<=1e6)。然后有n行书名(书名是一个英文字符串,字符串的长度小于100,中间没有空格)。
输出格式
第一行是不同书籍的数量,然后按照书名的字典序输出书名和数量。
样例输入
4 English maths Chinese Chinese
样例输出
3 chinese 2 english 1 math 1
二、解题思路
为何会想到用map映射解决这道题?
主要是看到输出格式中按照书名的字典顺序输出,如果不用映射输出(映射自带有排序功能,string类型的变量会按照字母顺序来输出),很难再想出输出会按照字母顺序输出。
敲代码时,需要注意
1、在输入输出过多时,不宜用cin cout进行输入输出,很容易超时,应该改用C语言正常使用的printf 和scanf进行输入和输出
2、使用map、set等stl库时,千万不要忘了头文件,和using namespace std;
3、使用map(string,int) a时,直接a[string]++,因为在int类型value没有初始化时,默认值就是0。
三、代码及注释
#include<map> #include<string> #include<utility> using namespace std; int main() { int n; string name;//不能忘记头文件string cin >> n; map<string, int> a;//不能忘记头文件<map> for (int i=0;i<n;i++) { cin >> name; a[name]++;//此时并没有对key的value进行初始化,但int类型默认是0!方便许多 } cout << a.size()<<endl; for (map<string, int>::iterator it = a.begin(); it != a.end(); it++) { cout << it->first << " " << it->second << endl;//满足题目要求,按照first的字母进行排序输出 } return 0; }