2904: 【例64.2】 生日相同

内存限制:64 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:2 解决:2

题目描述

在一个有$180$人的大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。
试找出所有生日相同的学生。

输入

第一行为整数$n$,表示有$n$个学生,$n≤180$。
此后每行包含一个字符串和两个整数,分别表示学生的名字(名字第一个字母大写,其余小写,不含空格,且长度小于$20$)和出生月($1≤m≤12$)日($1≤d≤31$)。
名字、月、日之间用一个空格分隔。

输出

每组生日相同的学生,输出一行,其中前两个数字表示月和日,后面跟着所有在当天出生的学生的名字,数字、名字之间都用一个空格分隔。
对所有的输出,要求按日期从前到后的顺序输出。
对生日相同的名字,按名字从短到长按序输出,长度相同的按字典序输出。
如没有生日相同的学生,输出"None"。

样例输入 复制

6
Avril 3 2
Candy 4 5
Tim 3 2
Sufia 4 5
Lagrange 4 5
Bill 3 2

样例输出 复制

3 2 Tim Bill Avril
4 5 Candy Sufia Lagrange

提示

#include<bits/stdc++.h>
using namespace std;
int n,m,d;
string name;
bool flag;
vector<string> a[13][32];
bool cmp(string x,string y){
    return x.size()<y.size()||x.size()==y.size()&&x<y;
}
int main(){
    flag=false;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>name>>m>>d;
        a[m][d].push_back(name);
    }
    for(int i=1;i<=12;i++){
        for(int j=1;j<=31;j++){
            if(a[i][j].size()>=2){
                flag=true;
                cout<<i<<" "<<j<<" ";
                sort(a[i][j].begin(),a[i][j].end(),cmp);
                for(int k=0,len=a[i][j].size();k<len;k++){
                    cout<<a[i][j][k]<<" ";
                }
                cout<<endl;
            }
        }
    }
    if(!flag) cout<<"None"<<endl;
    return 0;
}