题目描述 Description

有N个人,各自有一个姓名和ID(别名)。每个人的姓名和ID都没有重复。这些人依次进入一间房间,然后可能会离开。过程中可以得到一些信息,告知在房间里的某个人的ID。你的任务是准确地确定每个人的ID。

输入描述 Input Description

第一行是整数N,表示N个人,N<=20。

接下来的一行是N个人的ID,用一个空格分隔。

接下来的若干行是过程的记录:一个字母和一个字符串。字母是E、L或M中的一个。E表示进入房间,后面跟的字符串表示进来的人的姓名;L表示离开房间,后面跟的字符串表示离开的人的姓名;M表示回答询问,后面跟的字符串表示:当前用这个ID人在房间里面。

最后一行Q表示结束。

所有的姓名和ID都由不超过20个的小写字母组成。所有姓名都会在记录中出现。

一开始时,房间时空的。

输出描述 Output Description

共N行,每行形如:“姓名:ID”,如果ID不能确定,输出???。

按照姓名的字典顺序输出。

样例输入 Sample Input

7

bigman mangler sinbad fatman bigcheese frenchie capodicapo

E mugsy

E knuckles

M bigman

M mangler

L mugsy

E clyde

E bonnie

M bigman

M fatman

M frenchie

L clyde

M fatman

E ugati

M sinbad

E moriarty

E booth

Q

样例输出 Sample Output

bonnie:fatman

booth:???

clyde:frenchie

knuckles:bigman

moriarty:???

mugsy:mangler

ugati:sinbad

/*
匈牙利算法+map预处理,WA 80分,目前还没找出错误来
*/
#include<cstdio>
#include<iostream>
#include<map>
#include<cstring>
#include<algorithm>
#define M 30
using namespace std;
map<string,int> id;
map<string,int> mz;
int in_mz[M],n,cnt;
int used[M],belong[M],a[M][M],be2[M];
string idd[M],mzz[M];
struct node
{
int ID,MZ;
};node ans[M];
bool find(int i)
{
for(int j=;j<=n;j++)//循环姓名
if(!used[j]&&a[i][j])
{
used[j]=;
if(!belong[j]||find(belong[j]))
{
belong[j]=i;
return true;
}
}
return false;
}
bool cmp(const node&x,const node&y)
{
return mzz[x.MZ]<mzz[y.MZ];
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
a[i][j]=;
for(int i=;i<=n;i++)
{
string s;cin>>s;
id[s]=i;
idd[i]=s;
}
while()
{
char c;cin>>c;
if(c=='Q')break;
if(c=='E')
{
string s;cin>>s;
if(!mz[s])
{
mz[s]=++cnt;
mzz[cnt]=s;
}
in_mz[mz[s]]=;
}
if(c=='L')
{
string s;cin>>s;
in_mz[mz[s]]=;
}
if(c=='M')
{
string s;cin>>s;int num=id[s];
for(int i=;i<=n;i++)
if(!in_mz[i])a[num][i]=;
}
}
for(int i=;i<=n;i++)//循环ID
if(find(i))
memset(used,,sizeof(used));
for(int i=;i<=n;i++)be2[belong[i]]=i;
for(int i=;i<=n;i++)//循环ID
{
memset(used,,sizeof(used));
a[i][be2[i]]=;
belong[be2[i]]=;
if(!find(i))
ans[i].MZ=be2[i],ans[i].ID=i;
else
ans[i].MZ=be2[i],ans[i].ID=;
a[i][be2[i]]=;
belong[be2[i]]=i;
}
sort(ans+,ans+n+,cmp);
idd[]="???";
for(int i=;i<=n;i++)
cout<<mzz[ans[i].MZ]<<":"<<idd[ans[i].ID]<<endl;
return ;
}

姓名与ID(codevs 1027 未结题)的更多相关文章

  1. 1027 姓名与ID[二分图匹配(匈牙利)]

    1027 姓名与ID  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解  查看运行结果       题目描述 Description 有N个人,各自有一 ...

  2. 《基于Cortex-M4的ucOS-III的应用》课程设计 结题报告

    <基于Cortex-M4的ucOS-III的应用>课程设计 结题报告 小组成员姓名:20155211 解雪莹 20155217 杨笛 20155227 辜彦霖 指导教师:娄嘉鹏 一.设计方 ...

  3. 《基于Arm实验箱的国密算法应用》课程设计 结题报告

    <基于Arm实验箱的国密算法应用>课程设计 结题报告 小组成员姓名:20155206赵飞 20155220吴思其 20155234昝昕明 指导教师:娄嘉鹏 设计方案 题目要求:基于Arm实 ...

  4. [codevs1027]姓名与ID

    [codevs1027]姓名与ID 试题描述 有N个人,各自有一个姓名和ID(别名).每个人的姓名和ID都没有重复.这些人依次进入一间房间,然后可能会离开.过程中可以得到一些信息,告知在房间里的某个人 ...

  5. uva401 - Palindromes结题报告

    题目地址 :  http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  6. Delphi XE2 之 FireMonkey 入门(45Finally) - 结题与问题

    Delphi XE2 之 FireMonkey 入门(45Finally) - 结题与问题 很喜欢 FMX 的一些新控件, 如: TExpander.TArcDial.TComboTrackBar.T ...

  7. PyQt专题结题感言

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 今天写完PyQt专题显示部件的最后一篇文章,长长的 ...

  8. codevs 1027 姓名与ID

    /* 二分图匹配 建图稍麻烦点 不过 有STL大法带我上天 说正经的 先假设都有关系 然后把确定的没有关系的删掉 这样跑出来的一定是完美匹配 至于确定的匹配嘛 删掉这一条 不再是完美匹配 然后记下排序 ...

  9. 大搜车知乎live中的面试题结题方法记录

    1.HTML&CSS(分别10分) 1. 一个div,宽度是100px,此时设置padding是20px,添加一个什么css属性可以让div的实际宽度仍然保持在100px,而不是140px? ...

随机推荐

  1. CentOS安装GlassFish4.0 配置JDBC连接MySQL

    转自:http://linux.it.net.cn/CentOS/course/2014/0724/3319.html 版本glassfish-4.0.zip 1.解压,拷贝到指定安装路径   unz ...

  2. 启动Windows PowerShell ISE

    Windows Server 2008 R2 环境下,启动PoserShell ISE方法: 方法1:在cmd.exe控制台或运行框中,输入 powershell_ise.exe 执行即可. 方法2: ...

  3. java数据结构和算法04(链表)

    前面我们看了数组,栈和队列,大概就会这些数据结构有了一些基本的认识,首先回顾一下之前的东西: 在数组中,其实是分为有序数组和无序数组,我简单实现了无序数组,为什么呢?因为有序数组的实现就是将无序数组进 ...

  4. hihocoder offer收割编程练习赛11 D 排队接水

    思路: 莫队算法+树状数组. 莫队算法的基本思想是对大量要查询的区间进行离线处理,按照一定的顺序计算,来降低复杂度.概括来说,我们在知道了[l, r]的解,并且可以通过一个较低的复杂度推出[l - 1 ...

  5. [BZOJ1798][AHOI2009]Seq维护序列 线段树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 一眼看过去线段树,事实上就是线段树.对于乘和加的两个标记,我们可以规定一个顺序,比如 ...

  6. 如何选安卓android|linux系统开发板,简化学习难度,缩短开发进程

    平台一:iTOP-4412精英版 系统支持:Android 4.0.3系统  / Android 4.4系统 / Linux + Qt系统 / Ubuntu12.04系统 开发板特点:Cortex-A ...

  7. css 样式渲染

     1.文字过长时,自动换行

  8. Matrix (二分套二分

    Given a N × N matrix A, whose element in the i-th row and j-th column Aij is an number that equals i ...

  9. C#readonly 关键字与 const 关键字的区别

    1. const 字段只能在该字段的声明中初始化,readonly 字段可以在声明或构造函数中初始化.因此,根据所使用的构造函数,readonly 字段可能具有不同的值. 2. const 字段是编译 ...

  10. Log.d 日志调试查看(所有平台)

    https://www.cnblogs.com/onechen/p/6436748.html http://docwiki.embarcadero.com/Libraries/Berlin/en/FM ...