Description
引子:
这一些不要管,读了没有用的
背景:
WJMZBMR 喜欢上 QQ。。但是很多人的头像已经变成灰色了。这让他压力很大。而且 WJMZBMR 的好友太多了,大量的灰色头像让他无法准确的找到他想找的好友。。
今天 WJMZBMR 决定清理一下他的 QQ,找出那些不会在跳动的头像并且把它们踢掉。为此他翻出了最近一个月的聊天记录。
如果一个头像在在最近一个月中与 WJMZBMR 聊天次数小于等于 2 次, WJMZBMR 就会认为这是不会再跳动的灰色头像然后把他删掉。
那么请你为 WJMZBMR 写个程序完成这件事情,并输出剩下的头像。
定义:
头像其实就是 ID,是一个长度小于等于 30 的,由小写或者大写英文字母组成的字符串。
严格的数学定义:
给出一些字符串,输出其中出现次数大于等于 3 次的。
关于输出的顺序,出现次数多在前,如果次数一样多就按字典序,相同的 ID 只输出一次。
Input
第一行 N 表示聊天记录的长度。
接下来 N 行每行一个字符串表示与 WJMZBMR 聊天的 ID。
Output
第一行表示要输出的头像的个数 M。
之后M行每行一个字符串表示输出的 ID(请按给定顺序输出,两个相同的 ID 只输出一次)。
6
Gx
tracyhenry
seventhplus
Gx
seventhplus
Gx
-
Sample Input
1
Gx
-
Sample Output
HINT
20%的数据 N<=1000
100%的数据 N<=100000
Uploaded By MCHacker
直接STLset爆枚......
注意最后的排序顺序.
#include <iostream>
#include <cstdio>
#include <string>
#include <queue>
#include <set>
#include <algorithm>
using namespace std;
const int MAXN = 100010;
multiset<string> st;
priority_queue<string> q;
string s[MAXN], r[MAXN];
bool comp(string a, string b) { // 最后的排序
int aa = st.count(a), bb = st.count(b);
if (aa!=bb) return aa>bb;
return a<b;
}
int main() {
int n, id = 0; scanf("%d", &n);
for (int i=1; i<=n; ++i) {
string str; cin >> str;
if (!st.count(str)) s[++id] = str;
st.insert(str);
}
int res = 0;
for (int i=1; i<=id; ++i) { // 枚举每个字符串
if (st.count(s[i])>2) { // 大于等于3的,可以有
r[++res] = s[i]; // 存入结果数组
}
}
sort(r+1, r+res+1, comp); // 排序
printf("%d", res);
for (int i=1; i<=res; ++i) {
printf("\n"); cout << r[i];
}
return 0;
}