专栏文章
题解:P13857 [SWERC 2020] Gratitude
P13857题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mio29uo0
- 此快照首次捕获于
- 2025/12/02 12:11 3 个月前
- 此快照最后确认于
- 2025/12/02 12:11 3 个月前
题目大意:
给定 个字符串,输出出现次数最多的 个字符串,如果出现次数相同,则最后一次出现的位置靠后的在前。
题目思路:
这道题不算太难,主要就是输出的这一部分。
首先我们可以用一个
map 来存一下字符串的信息,它的值为一个二元组,表示出现次数和最后出现的位置。接着我们用一个结构体数组来存下这些数据,这样是为了方便排序和输出,排序的函数其实照着题面说的写就行了。
最后排完序了,我们就输出。注意,有时候可能没有 个互不相同的字符串,那我们就按照规则全部输出。
还有一个细节就是在输入字符串前要吃掉换行符,否则会有问题。
总体思路还是挺简单的,代码如下:
CPP#include <bits/stdc++.h>
using namespace std;
int n, k, top;
struct node { //结构体数组存数据
string str;
int pos, total;
} a[100010];
string s[100010];
map <string, pair <int, int> > mp; //map存信息
bool cmp (node x, node y) { //排序函数
if (x.total != y.total) return x.total > y.total;
return x.pos > y.pos;
}
int main () {
cin >> n >> k;
getline (cin, s[0]); //吃掉换行符
for (int i = 1; i <= n * 3; i ++) {
getline (cin, s[i]); //输入
mp[s[i]].second ++; //更新信息
mp[s[i]].first = i;
}
for (auto& [u, v] : mp) { //将map的数据复制进结构体数组
top ++;
a[top].str = u;
a[top].pos = v.first;
a[top].total = v.second;
}
sort (a + 1, a + top + 1, cmp); //进行排序
for (int i = 1; i <= min (top, k); i ++) //输出
cout << a[i].str << '\n';
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...