一、map
erase()删除函数:可以迭代器删除,关键字删除,成片删除。
例:1、iter=mapStu.find(1);
mapStu.erase(iter);
2、int n = mapStu.erase(1);//删除了会返回1,否则返回0;
3、mapStu.erase(mapStu.begin(),mapStu.end());
equal_range函数返回一个pair,pair里面的第一个变量是lower_bound返回的迭代器,pair的第二个迭代器返回的是upper_bound返回的迭代器,如果这两个迭代器相等的话,则说明map中不出现这个关键字。
二、去重,排序,计数
例:蓝桥杯真题 http://newoj.acmclub.cn/contests/1258/problem/9
1659: 2018蓝桥杯培训-STL应用专题-day 3 map作业题4
题目描述:
福尔摩斯从X星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。
输入:
输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
紧接着是n行字符串,都是小写字母组成,长度都为8
输出:
一个整数, 表示每行密码的所有排列在s中匹配次数的总和。
样例输入
aaaabbbbaabbcccc
2
aaaabbbb
abcabccc
样例输出
4
讲真,第一反应就是KMP,然后就不知道该怎么做了,感觉例题很典型
#include <iostream> #include <algorithm> #include <map> #include <cstdio> using namespace std; int main() { // freopen("Atext.in","r",stdin); string a,tmp=""; int n,ans=0;; cin >> a; map<string,int> pp; for(int i=0;i<a.size()-7;i++) { tmp=""; for(int j=i;j<i+8;j++) { tmp+=a[j]; } sort(tmp.begin(),tmp.end()); //cout << tmp <<endl; pp[tmp]++; } cin >> n; while(n--){ cin >> tmp; sort(tmp.begin(),tmp.end()); ans+=pp[tmp]; } cout << ans << endl; return 0; }