noip模拟-确定的位置(map + vector)

想清楚了就不难
这题还是在c程上机课的时候a掉的

还是aaa和vv的命名,本家独创
还是只会举例论证,wztcl

题目:确定的位置

描述
hzy很喜欢了解歌曲的排行榜,他每次都从XX网站获知。
由于这个网站想对这个歌曲的排行榜含蓄的告诉大家,组织了一个“猜榜大赛”。
这个网站宣布一些歌曲的信息,那些歌曲在歌曲榜上的前几名,例如:
·”qianlizhiwai” 是在榜上的前三名
·”qianlizhiwai”,”dachengxiaoai” 是在歌曲榜的前两名
网站不会把歌曲的名次十分明确的告诉你,他就是想让你通过这些信息,推出一部分歌曲的名次,现在困惑的hzy找您帮忙,想让您推出所有确定名次的歌曲。
输入
第一行包括一个整数n, 1≤n≤500,表示网站给你的信息的条数。
下面n行包括一条信息,形式为”A and B song1 song2 song3 … songA”,1≤A≤B≤100,表示”song1”,”song2”,…,”songA”是在歌曲榜的前B位。
每一首歌都是一个string,由最多25个小写字母组成。
输出
输出可以知道的所有的歌的排名,形式:”Position Song”位置必须有序。
输入样例 1
2
1 and 3 lonely
2 and 2 trebami jasekonja
输出样例 1
3 lonely
输入样例 2
3
2 and 2 pjesma1 pjesma2
3 and 4 pjesma1 pjesma3 pjesma4
1 and 3 pjesma4
输出样例 2
3 pjesma4
4 pjesma3

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<map>
#include<string>
#include<vector>
#include<sstream>
#define INF 0xfffffff
using namespace std;
int n, m, k;
int a, b, c, d;
int sum, ans, num, cnt[105];
string s, sa, sb;
map<string, int>aaa;
vector<string>vv[105];
vector<string>::iterator it;
int main() {
num = 0;
aaa.clear();
for (int i = 1; i < 105; i++)
vv[i].clear();
cin >> n;
int tmp = INF;
while (n--) {
cin >> k >> s >> m;
while (k--) {
cin >> s;
if (!aaa[s])
aaa[s] = m, vv[m].push_back(s);
else if (aaa[s] > m){
for(it=vv[aaa[s]].begin();it!=vv[aaa[s]].end();)
if(*it==s) it=vv[aaa[s]].erase(it);
else it++;
vv[m].push_back(s);
aaa[s] = m;
}
}
}
for (int i = 1; i < 105; i++){
num+=vv[i].size();
//没有num遇到1 1 and 3 lonely这种情况会输出3 lonely(正确是没有输出)
if (vv[i].size() == 1&&num==i)
cout << i << " " << vv[i][0] << endl;
}
return 0;
}

感觉没什么太难理解的不必要打什么注释= =