虽然是xjbg的题目,但是并不很好做。

  题意不难理解。读入有点麻烦。做法是先正着推每段对话的?可能是谁说的,然后反过来选择即可。正推时,其中vis数组表示谁已经被用过了,cnt表示该组当前可以选择几个,choose[i][j]表示第i段对话中,选择第j个名字作为说话者是不是可能的。

  那么正推时就不难理解了,首先要这个名字没出现在他说的话中,然后1.这是第一段话,2.前一段对话中这个名字不是被选择作为说话者的,3.前一段对话选了好几个(因此我可以选择这个名字作为说话者而不重复,因为前一段对话可以选另外一个名字)。这三个条件任意一个满足即可。

  然后反过来选择时,从最后一个开始,选择其可行的,当前这段对话这个名字是作为说话者了以后,前一段对话显然这个名字不能再作为说话者,因此需要更新choose数组。然后就写完了。(没有什么算法,但是也不好写。。)

  具体见代码:

 #include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;
const int N = + ; int cnt[N];
int choose[N][N];
int vis[N];
string name[N];
string ss[N]; bool isok(char c)
{
if(c>='' && c<='') return ;
if(c>='a' && c<='z') return ;
if(c>='A' && c<='Z') return ;
return ;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(cnt,,sizeof(cnt));
memset(choose,,sizeof(choose));
map<string, int> M;
int n;scanf("%d",&n);
char s[];
for(int i=;i<=n;i++)
{
scanf(" %s",s);
string str = (string)s;
M[str] = i;
name[i] = str;
}
int m;scanf("%d",&m);getchar();
int k = ;
for(int i=;i<=m;i++)
{
int flag = ;
memset(vis,,sizeof(vis));
string str = "";
string now = "";
getline(cin, str);
ss[i] = str;
int sz = str.length();
for(int j=;j<sz;j++)
{
if(isok(str[j]))
{
now = now + str[j];
}
else if(now != "")
{
if(str[] != '?')
{
cnt[i] = ;
choose[i][M[now]] = ;
j = sz;
flag = ;
}
else
{
if(M[now] != )
{
vis[M[now]] = ;
}
now = "";
}
}
}
if(now != "" && M[now] != ) vis[M[now]] = ;
if(flag) continue;
int t = ;
for(int j=;j<=n;j++)
{
if(!vis[j] && (i== || cnt[i-] > || !choose[i-][j]))
{
choose[i][j] = ;
cnt[i]++;
t = ;
}
}
k = k || t;
} if(k) {puts("Impossible");continue;}
vector<string> ans;
for(int i=m;i>=;i--)
{
ss[i].erase(, ss[i].find(':'));
for(int j=;j<=n;j++)
{
if(choose[i][j])
{
if(i > ) choose[i-][j] = ;
ans.push_back(name[j] + ss[i]);
break;
}
}
}
if(ans.size() != m) {puts("Impossible");continue;}
for(int i=ans.size()-;i>=;i--) cout << ans[i] << endl;
}
return ;
}

CodeForces 754C Vladik and chat ——(xjbg)的更多相关文章

  1. Codeforces Round #390 (Div. 2) C. Vladik and chat(dp)

    http://codeforces.com/contest/754/problem/C C. Vladik and chat time limit per test 2 seconds memory ...

  2. CodeForces 755D PolandBall and Polygon ——(xjbg)

    每次连线,起点和终点之间,每一个被点亮的点,这些点都能连出去两条线,因此可以增加的块数+2(1这个点除外,因为只有连出的点没有连进的点),计算起点和终点之间有几个点被点亮即可,然后1这个点特判一下.感 ...

  3. CodeForces 754C Vladik and chat (DP+暴力)

    题意:给定n个人的m个对话,问能不能找一个方式使得满足,上下楼层人名不同,并且自己不提及自己. 析:首先预处理每一层能有多少个user可选,dp[i][j] 表示第 i 层是不是可以选第 j 个use ...

  4. Codeforces Round #219 (Div. 1)(完全)

    戳我看题目 A:给你n个数,要求尽可能多的找出匹配,如果两个数匹配,则ai*2 <= aj 排序,从中间切断,分成相等的两半后,对于较大的那一半,从大到小遍历,对于每个数在左边那组找到最大的满足 ...

  5. Codeforces 1301B Motarack's Birthday(二分)

    题目链接:http://codeforces.com/problemset/problem/1301/B 思路: (1)都是-1的情况 (2)只有一个除-1之外的数 (3)至少有两个除-1之外的不同的 ...

  6. Codeforces 997A Convert to Ones(思维)

    https://codeforces.com/problemset/problem/997/A 题目大意: 给定一串0-1序列,定义两种操作: 操作一:选取一连续串倒置. 操作二:选取一连续串把进行0 ...

  7. codeforces 286 E. Ladies' Shop (FFT)

    E. Ladies' Shop time limit per test 8 seconds memory limit per test 256 megabytes input standard inp ...

  8. [CodeForces - 296D]Greg and Graph(floyd)

    Description 题意:给定一个有向图,一共有N个点,给邻接矩阵.依次去掉N个节点,每一次去掉一个节点的同时,将其直接与当前节点相连的边和当前节点连出的边都需要去除,输出N个数,表示去掉当前节点 ...

  9. codeforces 380A Sereja and Prefixes (递归)

    题目: A. Sereja and Prefixes time limit per test 1 second memory limit per test 256 megabytes input st ...

随机推荐

  1. docker 入门4 - 群 【翻译】

    开始,第 4 部分:群 先决条件 安装 Docker 版本 1.13 或更高版本. 获取第 3 部分先决条件中所述的 Docker Compose. 获取 Docker Machine, Mac 的 ...

  2. PowerDesigner最基础的使用方法

    1:入门级使用PowerDesigner软件创建数据库(直接上图怎么创建,其他的概念知识可自行学习) 我的PowerDesigner版本是16.5的,如若版本不一样,请自行参考学习即可.(打开软件即是 ...

  3. c#OpenCVSharp+Zxing识别条形码

    参考博客:https://www.cnblogs.com/dengxiaojun/p/5278679.html,但是他的demo下载太贵了 可以下载这个https://download.csdn.ne ...

  4. Qt调用VS生成的dll

      预备知识: 1.如果在没有导入库文件(.lib),而只有头文件(.h)与动态链接库(.dll)时,我们才需要显示调用,如果这三个文件都全的话,我们就可以使用简单方便的隐式调用. 2.通常Windo ...

  5. 关于工作单元模式——工作单元模式与EF结合的使用

    工作单元模式往往和仓储模式一起使用,本篇文章讲到的是工作单元模式和仓储模式一起用来在ef外面包一层,其实EF本身就是工作单元模式和仓储模式使用的经典例子,其中DbContext就是工作单元,而每个Db ...

  6. Linux学习(二)-Xshell 5和Xftp 5的安装和使用

    (一)软件介绍: (1)Xshell: Xshell通过互联网可以连接到远程的服务器,然后通过模拟终端来实现对服务器的各种操作,而且这款软件可以很好的解决中文乱码问题,非常的方便快捷. (2)Xftp ...

  7. php 限制标题长度,将一个中文转换成一个字符

    点击链接加入群[php/web 学习课堂]:https://jq.qq.com/?_wv=1027&k=5UJ9vEa 欢迎大家加入,一起讨论学习 玩这个功能的时候,我们要注意一点,我们是用中 ...

  8. 记录一次ABP下载模板的坑

    1.拉取ABP官网的模板的最新代码,我的代码结构是这样的 https://aspnetboilerplate.com/Templates 环境安装的部分我就不说明了.node.js  npm 等等部分 ...

  9. Celery 初步使用心得

    一. 基本介绍 Celery是一个专注于实时处理和任务调度的分布式任务队列.所谓任务就是消息,消息中的有效载荷中包含要执行任务需要的全部数据. 使用Celery常见场景: Web应用.当用户触发的一个 ...

  10. 将TensorFlow训练好的模型迁移到Android APP上(TensorFlowLite)

    转自:https://blog.csdn.net/u012328159/article/details/81101074 https://blog.csdn.net/masa_fish/article ...