虽然是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 ;
}

最新文章

  1. 【Codeforces 738C】Road to Cinema
  2. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分
  3. JDK和tomcat环境变量配置
  4. OpenCV imread读取图片,imshow展示图片,出现cv:Exception at memory location异常
  5. 第一次正式小用Redis存储
  6. 10款基于jquery的web前端特效及源码下载
  7. xml--小结②XML的基本语法
  8. input添加邮箱的时候自动显示后缀
  9. java中HashSet详解
  10. mysql启动
  11. linux daemon
  12. WinForm 对话框、流
  13. HTML5基本知识点
  14. Anaconda多版本Python管理
  15. python_百文买百鸡问题
  16. JAVA中正则表达式常用的四个方法
  17. Nginx从入门到实践(三)
  18. Linux程序宕掉后如何通过gdb查看出错信息
  19. JSOI2020备考知识点复习
  20. 十三、MUI的日期起始和结束日期设置

热门文章

  1. 怎样设置cookie生效的域名和路径
  2. 补充第11期作业:Long.fastUUID与UUID.toString之间的关系
  3. 高性能网站建设之 MS Sql Server数据库分区
  4. 关于ManualResetEvent的实例分析
  5. IExtenderProvider,c#组件扩展控件属性
  6. VBA学习资料分享-5
  7. 【原创】大叔经验分享(80)openresty(nginx+lua)发邮件
  8. Lua虚拟机中的数据结构与栈
  9. C++性能榨汁机之虚函数的开销
  10. pthread 编程基础