首先每个串都必须是$S$的子序列,否则无解。

按长度从小到大依次考虑每个串,如果它两边都不能放,那么无解。

如果能放一边,那么放进去,把待定的全部放入另一边。

如果两边都能放,那么看看能否待定,如果不能则把它和待定的分别放入两边。

时间复杂度$O(nm)$。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 4005
int n,i,j,x,y,len[N],b[N],f[2][N],cnt[2],q[N],t;char a[N][N];
inline bool cmp(int x,int y){return len[x]<len[y];}
inline bool check(int x,int y){
if(len[x]>len[y])return 0;
for(int i=j=0;i<len[x];i++){
while(j<len[y]&&a[x][i]!=a[y][j])j++;
if(j==len[y])return 0;
j++;
}
return 1;
}
int main(){
scanf("%d",&n);
for(i=0;i<=n;i++){
scanf("%s",a[i]);
len[i]=strlen(a[i]);
b[i]=i;
if(!check(i,0))return puts("impossible"),0;
}
len[0]=0;
std::sort(b+1,b+n+1,cmp);
for(i=1;i<=n;i++){
x=check(f[0][cnt[0]],b[i]);
y=check(f[1][cnt[1]],b[i]);
if(!x&&!y)return puts("impossible"),0;
if(x&&!y){
f[0][++cnt[0]]=b[i];
for(j=1;j<=t;j++)f[1][++cnt[1]]=q[j];
t=0;
}
if(!x&&y){
f[1][++cnt[1]]=b[i];
for(j=1;j<=t;j++)f[0][++cnt[0]]=q[j];
t=0;
}
if(x&&y){
if(check(q[t],b[i]))q[++t]=b[i];
else{
f[0][++cnt[0]]=b[i];
for(j=1;j<=t;j++)f[1][++cnt[1]]=q[j];
t=0;
}
}
}
for(j=1;j<=t;j++)f[1][++cnt[1]]=q[j];
printf("%d %d\n",cnt[0],cnt[1]);
for(i=1;i<=cnt[0];i++)puts(a[f[0][i]]);
for(i=1;i<=cnt[1];i++)puts(a[f[1][i]]);
return 0;
}

  

BZOJ4110 : [Wf2015]Evolution in Parallel的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. The evolution of cluster scheduler architectures--转

    原文地址:http://www.firmament.io/blog/scheduler-architectures.html cluster schedulers are an important c ...

  3. A Pattern Language for Parallel Application Programming

    A Pattern Language for Parallel Application Programming Berna L. Massingill, Timothy G. Mattson, Bev ...

  4. 共线性图 | Alluvial Diagrams | Parallel plot | Parallel Coordinates Plot

    最近有个需求需要画如下的图: 这些图的核心意思是一样的,就是connection,把不同的数据连到一起. 文章里把这图叫做共线性图,是按功能命名的,Google里搜不到. 搜到类似的,这个图叫 Par ...

  5. .Net多线程编程—System.Threading.Tasks.Parallel

    System.Threading.Tasks.Parallel类提供了Parallel.Invoke,Parallel.For,Parallel.ForEach这三个静态方法. 1 Parallel. ...

  6. Java 8函数编程轻松入门(五)并行化(parallel)

    1.并发与并行的区别 并发: 一个时间段内有几个程序都处于已启动到运行完毕之间,且这几个程序都是在同一个处理机上运行.但在任一个时刻点只有一个程序在处理机上运行 并行: 在同一个时刻,多核处理多个任务 ...

  7. Parallel并行之乱用

    关于Parallel我也不细说了,一则微软封装的很好用,二来介绍这个的遍地都是. 我要说的是,要想成为一个优秀的标题党,一定要把重点放到别的地方,为了节省大家阅读时间,我先把结论说了,然后再慢慢从头说 ...

  8. 代码的坏味道(12)——平行继承体系(Parallel Inheritance Hierarchies)

    坏味道--平行继承体系(Parallel Inheritance Hierarchies) 平行继承体系(Parallel Inheritance Hierarchies) 其实是 霰弹式修改(Sho ...

  9. 多线程之任务: Task 基础, 多任务并行执行, 并行运算(Parallel)

    Task - 基于线程池的任务(在 System.Threading.Tasks 命名空间下) 多 Task 的并行执行 Parallel - 并行计算(在 System.Threading.Task ...

随机推荐

  1. java web统计当前访问用户数量

    1.使用SessionListener监听器,监听创建与销毁session的操作,利用计数方式记录当前session的数量

  2. android setCompoundDrawables 不显示问题

    在 vh.tvAddr.setCompoundDrawables(getResources().getDrawable(R.drawable.ic_real_state_loc), null, nul ...

  3. jpg Test

  4. 我的JavaEE学习路线图

    从学习Java开发到现在虽然也已经快三年了,但是要说到分享一下经验实在是不敢当.权当是对自己的一个总结吧,希望大家不吝指教,互相交流. 照旧,还是现来整理一下我学习Java的一个路线图吧,然后按照这个 ...

  5. hdu 1513

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 思路:正反分别求一次LCS,利用滚动数组对二取余滚动 #include<stdio.h&g ...

  6. mysqli的增强功能

    批量执行sql语句 批量执行dml语句 基本语法 $sqls="sql1.sql2.sql3...." mysqli::multi_query($sqls) 案例: $mysqli ...

  7. python 中time模块使用

    在开始之前,首先要说明这几点: 1.在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素.由于Python的time模块实现主 ...

  8. js 闭包原理理解

    问题?什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 很显然 ...

  9. Ubuntu 14.04 Trusty安装java环境

    原文:Install Oracle Java 6, 7, or 8 in Ubuntu 14.04 Trusty 命令如下: sudo add-apt-repository ppa:webupd8te ...

  10. inode

    硬盘的最小存储单位叫"扇区(sector)",每个扇区存储512字节(相当于0.5kb).系统读取硬盘时,只会读取多个sector即一个block.block 是文件存取的最小单位 ...