定义和遍历:
for(map<char, int> ::iterator it = m1.begin() ; it != m1.end() ; it ++)
{
cout << it->first << " " << it->second;
}
题目1:
注册名字(name),前面有相同的则对应加上数字(name1,name2,name3…),并输出。
反之,则注册为name,并输出OK
题目大意:
输入n个字符串,对于第一次输入的字符串(以前没有出现过的字符串)输出“OK”,对于第二次输入的字符串(与第原来输入过的字符串重复了)输出“以前出现过的字符串原型和出现次数”。
样例:
Inputcopy | Outputcopy |
---|---|
4 abacaba acaba abacaba acab | OK OK abacaba1 OK |
利用map保存同一字符串输入的个数,在0的时候输出OK,大于0输出个数即可。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include <map>
using namespace std;
int main()
{
map<string, int> p;
int n;
cin >> n;
while(n --)
{
string a;
cin >> a;
if(p[a] == 0) // 字符串首次出现
{
cout << "OK" << endl;
p[a] = 1; // 字符串已经出现了一次
}
else
{
cout << a << p[a] << endl;
p[a] ++; // 字符串的出现次数+1
}
}
return 0;
}
题目2:
乃琳是A-SOUL的MC担当(坏女人担当),她在和珈乐玩一种很新的牌。
这个牌的名字叫Asoul牌,牌名只由单个字母组成。
游戏规则是:每个人会得到一定数量的牌,然后每个人可以任意次将两张相同牌名的的牌组合成Asoul牌打出,最后剩下牌少的人获得胜利,如果剩余牌数相同,则收获平局,双方都无法获胜。
由于牌太多,乃琳整理不过来了,因此她决定向奶琪琳们求助,询问自己最后会剩下多少张牌,以及自己是否能够战胜珈乐。
输入描述:
第一行输入一个整数 n,代表两人各得到了多少张牌。1≤n≤106
第二行输入一个长度为 n 的字符串,代表乃琳得到的牌。
第三行输入一个长度为 n 的字符串,代表珈乐得到的牌。
输出描述:
第一行输出一个整数,代表乃琳最后剩下的牌数。
第二行输出一个字符串,若乃琳能够战胜珈乐,则输出"HHH!",否则输出 “555!”。
用例输入 1
5 AAEEW ABCDD
用例输出 1
1 HHH!
用例输入 2
5 AAEEW BBCDD
用例输出 2
1 555!
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
//map用来记录每个字符串中字符出现的次数
map< char, int > m1;
map< char, int > m2;
int a[N];
int cnt1,cnt2;
int sum1,sum2;
int main()
{
int n;
scanf("%d",&n);
string s1;
string s2;
cin >> s1;
cin >> s2;
for(int i = 0 ; i < n ; i ++) m1[s1[i]] ++; // 记录第一个字符串中每个字符的出现次数
for(int i = 0 ; i < n ; i ++) m2[s2[i]] ++; // 记录第一个字符串中每个字符的出现次数
for(map<char, int> ::iterator it = m1.begin() ; it != m1.end() ; it ++)
{
sum1 += it->second / 2; // 记录第一个字符串的”对数“
}
for(map<char, int >::iterator it = m2.begin() ; it != m2.end() ; it ++)
{
sum2 += it->second / 2; // 记录第二个字符串的”对数“
}
printf("%d\n",n - sum1 * 2);
if(sum1 > sum2) printf("HHH!\n");
else printf("555!\n");
return 0;
}