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!!!