姓名排序

Table of Contents

姓名排序

时间限制:C/C++语言 3000MS;其他语言 5000MS
内存限制:C/C++语言 131072KB;其他语言 655360KB

题目描述:

马上就要开学了,教务处的老师拿到了新生的名单,现在他需要根据考生的姓名录入一个拼音版的新名单。

老师录入时,需要输入姓和名(例如:ZHANG SAN,字母均为大写,姓名以空格隔开),并且要将这些人按一定规则排序。

排序的方式如下:

首先,按照该姓的出现次数排序,即:姓出现次数多的人先排序

其次,若两个人的姓出现的次数一样多(或者是同一个姓),按照原名单的顺序。

输入

输入包括多行,每一行两个字符串,代表一个人的姓和名

输出

输出排序后的名单

样例输入

ZHANG SAN
LI SI
WANG WU
WANG LIU
WANG QI
ZHANG WU
LI WU

样例输出

WANG WU
WANG LIU
WANG QI
ZHANG SAN
LI SI
ZHANG WU
LI WU

提示

范围

输入只包含大写字母,最多10000行,每行最多50个字符

  #include<bits/stdc++.h>
  typedef long long ll;
  const int maxn = 1e4 + 5;
  const int INF = 0x3f3f3f3f;
  const int MOD = 1e9 + 7;
  using namespace std;
  struct node {
      string x, m;
  }f[maxn];
  map<string, int>mp;
  bool cmp(node a, node b) {
      return mp[a.x] > mp[b.x];
  }
  int main() {
      int i = 0;
      while (cin >> f[i].x >> f[i].m) {
          mp[f[i].x]++;
          i++;
      }
      stable_sort(f, f + i, cmp);
      for (int x = 0; x < i; x++) {
          cout << f[x].x << " " << f[x].m << endl;
      }
      return 0;
  }