虽然是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. windows系统 MySQL8.0.12详细安装步骤及基本使用教程

    转载  https://blog.csdn.net/xiezhiming1234/article/details/82860339

  2. 怎样理解ECMAScript 和 JavaScript的关系

    JavaScript可以分为三大部分: 1. 核心语法 2. DOM 3. BOM 而核心语法实际上就是指的ECMAScript, 而JS又是不断在发展的, 而这个发展实际上最主要的就是ECMAScr ...

  3. .js文件中文乱码解决办法

    描述:.js文件里的中文内容在网页中显示乱码 解决办法:把JS文件的编码改为utf-8 VS2013解决步骤:文件——高级保存选项——Unicode (UTF-8带签名)  代码页 65001

  4. JAVA中ArrayList重写比较方法

    ArrayList的sort方法重写: 当ArrayList中存放的为含有多个成员变量的数据类型时,在进行sort排序时要重写比较方法,一般都写在这个数据类型类的内部如: package 算法竞赛入门 ...

  5. django 中自定义方法simple_tag

    simple_tag定义以及使用 模板中自定义方法 1. 在app下创建一个名为templatetags的python包 2. 在python中创建python文件 my_tag.py 3. 在pyt ...

  6. 安卓开发之利用XmlPullParser解析XML文件

    package com.lidaochen.phonecall; import android.support.v7.app.AppCompatActivity; import android.os. ...

  7. 安卓开发之获取SD卡空间数据

    package com.lidaochen.getsdcardspace; import android.os.Environment; import android.support.v7.app.A ...

  8. MVP架构的一个小例子

    主角: MVP是一种编程的架构模式,M=Model,负责提供数据:V=View,负责显示数据:P=Presenter,负责处理数据. 应用例子: csharp写的一个qq机器人. 一.Model层 获 ...

  9. JAVA语言程序设计课后习题----第六单元解析(仅供参考)

    1 本题就是基本函数的用法 import java.util.Scanner; public class Poone { public static void main(String[] args) ...

  10. linux物理地址和虚拟地址