COGS 898. [咲 -Saki-] 天才麻将少女什么编

★☆   输入文件:sakinani.in   输出文件:sakinani.out   简单对比
时间限制:1 s   内存限制:256 MB

题目背景

二十一世纪,世界上的麻将竞技人数超过一亿,日本每年也有大规模的全国大赛来对麻将选手进行选拔。从小学到高中,很多学校也设立了麻将部。

《天才麻将少女阿知贺篇 episode of side-A》『 -Saki- 阿知賀編 episode of side-A』是《天才麻将少女》『 -Saki-』的外传,从另一个视角讲述麻将少女们的故事。故事背景设定在《天才麻将少女》本篇第二主角原村和曾生活的奈良县,主角校为阿知贺女子学院。(有问题?内事百度,外事谷歌)

由于阿知贺人物存在感不够强,导致该作被称为“千里山篇”「 -Toki- 千里山編」,甚至 2012 年动画最萌也是千里山的園城寺怜同学。我们一直很疑惑这到底谁是主角,那么就让数据说话吧!

题目要求

我们给出一个人物列表,人物有其所属的学校。比如「松実玄」同学隶属「阿知賀女子学院」什么的。有的人物没有所属学校或没有明确给出其所属,可以无视。

人物每一次出场都会给其学校增加一点存在感。有少数“被牌爱着的孩子”,即“魔物”会有非常高的存在感,出场一次会有普通人出场两次的存在感。

我们需要统计,在给出的人物出场单中,哪个学校存在感最高,我们就把这篇动画命名为什么编。

输入格式

  • 输入文件第一行为一个整数 n ,表示有多少人物出现。下面 n 行是人物列表,每两行有两个字符串 A 和 B ,表示人物 A 属于学校 B 。没有同名人物,不会重复出现人物。
  • 下面一行一个整数 k ,表示魔物的数量。接下来 k 行,每行一个字符串,表示魔物的姓名,不保证魔物在人物列表中。
  • 接下来直到文件末尾,每行有一个字符串(空行不算),表示出场人物,可能会出现不存在于上面列表中的人物。

样例输入

7
宮永咲 清澄高校
原村和 清澄高校
片岡優希 清澄高校
園城寺怜 千里山女子高校
竹井久 清澄高校
天江衣 龍門渕高校
龍門渕透華 龍門渕高校
2
宮永咲
天江衣

原村和
高鴨穏乃
原村和
片岡優希
原村和
宮永咲

输出格式

  • 输出只有一行,即存在感最大的学校名称,并列第一则输出编码序小的一个。

样例输出

清澄高校

数据范围及要求

  • 对于 70% 的数据,总出现次数不超过 10000。
  • 对于 100% 的数据,学校数量不超过 40 ,人物数量不超过 200 ,总出现次数不超过 1000000。
  • 对于 40% 的数据,字符串中只有大写和小写字母。
  • 对于 100% 的数据,字符串中会存在大小写字母、汉字和日语假名,且长度不超过 100 。为了简化问题,输入输出文件都使用 ANSI 编码(一个东亚字符占两字节)。

 

模拟

屠龙宝刀点击就送

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#define N 1000005
using namespace std;
struct node
{
    string name,sch;
    bool flag;
}stu[N];
struct nodE
{
    string sch;
    int sum;
    bool operator<(nodE a)const
    {
        if(sum==a.sum) return sch<a.sch;
        else return sum>a.sum;
    }
}sv[N];
bool sq[N];
int n,m,num;
int Main()
{
    freopen("sakinani.in","r",stdin);
    freopen("sakinani.out","w",stdout);
    scanf("%d",&n);
    string a,b;
    for(int i=1;i<=n;++i)
    {
        cin>>stu[i].name>>stu[i].sch;
        for(int j=1;j<=num;++j)
        {
            if(sv[j].sch==stu[i].sch)
            goto flag;
        }
        sv[++num].sch=stu[i].sch;
        flag:;
    }
    scanf("%d",&m);
    for(;m--;)
    {
        cin>>a;
        for(int i=1;i<=n;++i)
            if(stu[i].name==a) stu[i].flag=true;
    }
    while(cin>>a)
    {
        b.clear();
        int sum=0;
        for(int i=1;i<=n;++i)
            if(stu[i].name==a)
            {
                b=stu[i].sch;
                if(stu[i].flag) sum=2;
                else sum=1;
                break;
            }
        if(!b.size()) continue;
        for(int i=1;i<=num;++i)
        if(sv[i].sch==b) sv[i].sum+=sum;
    }
    sort(sv+1,sv+1+num);
    cout<<sv[1].sch;
    return 0;
}
int sb=Main();
int main(int argc,char *argv[]) {;}

 

posted @ 2017-10-19 19:35  杀猪状元  阅读(270)  评论(0编辑  收藏  举报