c++STL库map的运用——昵称

MAP

map为c++stl库的一个关联函数,可以实现快速查找,复杂度为O(logn)。

map实现从键到值的映射,其效率高因为它用平衡二叉树来储存与访问 。(不用看了,反正我看不懂。)

总之呢,这个东西就可以让(bool)b[“abababab”]=1成为现实,十分好用。

(抄袭自己某篇博客)

一道例题:

昵称

题目描述

ZSUQ Messenger是一款跟腾讯QQ类似的软件。该软件的每个注册用户都拥有一个昵称以标识其身份。由于用户数很多,因此一个昵称可能会被许多不同的用户使用到,例如“Tom”,“Marry”,“Kate”等一些常用名会被频繁使用到。不过ZSUQ公司通过最近的一项调查发现,并没有超过5000个不同的昵称被用户使用到。   作为ZSUQ公司的一个员工,公司将提供给你一份所有用户的昵称名单,并要求你提交一份报告,告诉大家对于每个昵称都有多少用户在使用。

Input

数据第一行是一个整数N,(1<=N<=100,000),下面N行给出这N个用户的昵称名。每一个昵称名用一个不超过100个字符的字母字符串表示。注意昵称名称对大小写不敏感。

Output

输出要给出你对昵称用户的统计。按字符串顺序输出每个昵称,并输出该昵称有多少个用户在使用,中间用一个空格隔开。注意一行的首尾不要有多余空格,所有的昵称名均转换为小写字符输出。

Sample Input

4
Carp
infish
peipei
carp

Sample Output

carp 2
infish 1
peipei 1

思路

这道题很显然使用哈希,但是我们有map!!!

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<map>
#include<algorithm>
using namespace std;
int n;
string zf[1000001];
string read(){//快读
	string a;
	char ch=getchar();
	while (ch<'a'&&ch>'Z'||ch>'z'||ch<'A') ch=getchar();
	while (ch>='a'&&ch<='z'||ch>='A'&&ch<='Z') {
		if (ch>='a'&&ch<='z') a+=ch;
		else if(ch>='A'&&ch<='Z')a+=(ch+32);
		ch=getchar();
	}
	return a;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		zf[i]=read();
	map<string,int>f;//f记录出现过的数量
	map<string,bool>b;//b记录下面输出过没有
	for(int i=1;i<=n;i++) 
		f[zf[i]]++;//记录
	sort(zf+1,zf+n+1);//题目要求按字典序输出,排序
	for(int i=1;i<=n;i++)
		if(!b[zf[i]]){//没输出过
			b[zf[i]]=1;//输出过
			printf("%s %d\n",zf[i].c_str(),f[zf[i]]);//输出
		}
}

END!!!

THANK YOU!!!

发布了16 篇原创文章 · 获赞 2 · 访问量 1530

猜你喜欢

转载自blog.csdn.net/jay_zai/article/details/103996076
今日推荐