思路: 将4个串每个串都反向这样得到新的四个串一共8个串,对于母串每个位置检测这个串能不能放进去,hs或者后缀数组都可以。然后dp[i][j]  (0<i<len  0<=j<8)表示长度为i以第j个串结尾能不能到达,如果能 那么 就可以i+1位置利用原来处理出来的来转移。要注意开头结尾即可。

注意:以第i个串结尾  那么下个串 就不能用第i个串的反向串。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<time.h>
#include<string>
#define REP(i,n) for(int i=0;i<n;++i)
#define REP1(i,a,b) for(int i=a;i<=b;++i)
#define REP2(i,a,b) for(int i=a;i>=b;--i)
#define MP make_pair
#define LL long long
#define ULL unsigned long long
#define X first
#define Y second
#define MAXN 100050
using namespace std;
int pre[MAXN][];
bool bo[MAXN][];
bool dp[MAXN][];
bool ed[MAXN][];
ULL hs[][MAXN];
ULL p[MAXN];
int id[][MAXN];
char s[][MAXN];
int len[];
void makehs(int id){
hs[id][]=;
for(int i=;i<=len[id];++i)
hs[id][i]=hs[id][i-]*+s[id][i-]-'a'+;
}
ULL geths(int id,int l,int r){
l--;
return hs[id][r]-hs[id][l]*p[r-l];
}
int q[MAXN];
int tail;
void out(int cid,int l,int r)
{
for(int i=r;i>=l;--i)
q[tail++]=id[cid][i];
}
int main() {
p[]=;
for(int i=;i<MAXN;++i)p[i]=p[i-]*;
int tt,n,m;
scanf("%d",&tt);
while(tt--)
{
scanf("%d%d",&n,&m);
memset(bo,,sizeof(bo));
memset(dp,,sizeof(dp));
memset(ed,,sizeof(ed));
memset(pre,-,sizeof(pre));
int cid=;
for(int i=;i<;++i){
scanf(" %s",s[i*]);
len[i*]=len[i*+]=strlen(s[i*]);
for(int j=;j<len[i*];++j)
{
s[i*+][j]=s[i*][len[i*]-j-];
id[i*][j]=cid;
id[i*+][len[i*]-j-]=cid++;
}
makehs(i*);
makehs(i*+);
}
scanf(" %s",s[]);
len[]=strlen(s[]);
makehs();
//整串转移
for(int i=;i<m;++i){
for(int j=;j<;++j){
if(i+len[j]<=m){
ULL tmp1=geths(,i+,i+len[j]);
ULL tmp2=geths(j,,len[j]);
if(tmp1!=tmp2)continue;
bo[i][j]=true;
}
}
} //开头
for(int i=;i<m;++i){
for(int j=;j<;++j){
if(len[j]>i){
ULL tmp1=geths(,,i+);
ULL tmp2=geths(j,len[j]-i,len[j]);
if(tmp1!=tmp2)continue;
dp[i][j]=true;
}
}
} //结尾
for(int i=;i<m;++i){
for(int j=;j<;++j){
if(len[j]>len[]-i){
ULL tmp1=geths(,i+,len[]);
ULL tmp2=geths(j,,len[]-i);
if(tmp1!=tmp2)continue;
ed[i][j]=true;
}
}
} int pos=-,posx,flag=,fol;
//转移
for(int i=;i<m;++i){
for(int j=;j<;++j){
if(!dp[i][j])continue;
if(i==m-){
pos=i;
posx=j;
flag=;
break;
}
for(int k=;k<;++k){
if((j^k)==)continue;
if(!ed[i+][k])continue;
pos=i;
posx=j;
fol=k;
flag=;
break;
}
for(int k=;k<;++k){
if((j^k)==)continue;
if(!bo[i+][k])continue;
dp[i+len[k]][k]=true;
pre[i+len[k]][k]=j;
}
}
if(flag)break;
}
if(flag==)
{
puts("No solution!");
continue;
}
tail=;
if(pos!=m-){
out(fol,,m-pos-);
}
while(posx!=-){
if(len[posx]>pos+)out(posx,len[posx]-pos-,len[posx]-);
else out(posx,,len[posx]-);
int tmpx=posx;
posx=pre[pos][posx];
pos=pos-len[tmpx];
}
for(int i=tail-;i>;--i)printf("%d ",q[i]);
printf("%d\n",q[]);
}
return ;
}
/*
1
3 3
abc
abc
abc
abc
baa */

ZOJ 3817Chinese Knot(The 2014 ACM-ICPC Asia Mudanjiang Regional First Round)的更多相关文章

  1. hdu 5016 点分治(2014 ACM/ICPC Asia Regional Xi'an Online)

    Mart Master II Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  2. HDU 5000 2014 ACM/ICPC Asia Regional Anshan Online DP

    Clone Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total Submiss ...

  3. ZOJ 3811 Untrusted Patrol The 2014 ACM-ICPC Asia Mudanjiang Regional First Round

    Description Edward is a rich man. He owns a large factory for health drink production. As a matter o ...

  4. The 2014 ACM-ICPC Asia Mudanjiang Regional First Round C

    题意:       这个是The 2014 ACM-ICPC Asia Mudanjiang Regional First Round 的C题,这个题目当时自己想的很复杂,想的是优先队列广搜,然后再在 ...

  5. HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...

  6. 2014 ACM/ICPC Asia Regional Shanghai Online

    Tree http://acm.hdu.edu.cn/showproblem.php?pid=5044 树链剖分,区间更新的时候要用on的左++右--的标记方法,要手动扩栈,用c++交,综合以上的条件 ...

  7. 2014 ACM/ICPC Asia Regional Guangzhou Online

    Wang Xifeng's Little Plot http://acm.hdu.edu.cn/showproblem.php?pid=5024 预处理出每个点八个方向能走的最远距离,然后枚举起点,枚 ...

  8. 2014 ACM/ICPC Asia Regional Anshan Online

    默默的签到 Osu! http://acm.hdu.edu.cn/showproblem.php?pid=5003 #include<cstdio> #include<algorit ...

  9. 2014 ACM/ICPC Asia Regional 北京 Online

    G - Grade Ted is a employee of Always Cook Mushroom (ACM). His boss Matt gives him a pack of mushroo ...

随机推荐

  1. iOS 如何在一个已经存在多个project的workspace中引入cocoapods管理第三方类库

    一种新的第三方库管理工具:Carthage 如何使用Carthage管理iOS依赖库 Podfile Syntax Reference v1.1.0.rc.3 https://guides.cocoa ...

  2. js基础:函数表达式和函数声明

    函数表达式和函数声明的区别.实际上,解析器在向执行环境中加载数据是,对函数表达式和函数声明并非一视同仁.解析器会率先读取函数声明,并使其在执行任何代码之前可用.而函数表达式,则必须等到解析器执行到它所 ...

  3. (原创)提取Xilinx开发工具的迅雷下载地址

    ①进入Xilinx官网,进入Device->Design Tools,选择你想要下载的任意工具. ②进入新web页面,右方点击“Downloads”.③进入版本选择页面,选择想要的版本号,点击相 ...

  4. Google Maps地图投影全解析(3):WKT形式表示

    update20090601:EPSG对该投影的编号设定为EPSG:3857,对应的WKT也发生了变化,下文不再修改,相对来说格式都是那样,可以到http://www.epsg-registry.or ...

  5. ps中的位图,矢量图,颜色模式

    什么是位图?什么是矢量图? 位图是由像素组成的图像,在缩放和旋转的时候容易失真,同时文件容量较大 矢量图是根据几何特性来绘制的图形,通过数学公式计算获得的,不易制作色彩变化太多的图象 颜色模式 RGB ...

  6. js跨域_jsonP

    $.ajax("url", type:"get", dataType:"jsonp", jsonp:"callback" ...

  7. 关于String的equals问题和StringBuilder问题

    今天弄了一下String和StringBuilder,遇到了一些问题. 老规矩上代码图片: 发现stringBuilder的equals方法有问题,看了一下源码,发现stringbuilder没有重写 ...

  8. [经验] 新版SkyIAR、Easy Image X在有些PE里不能运行的解决办法

    [经验] 新版SkyIAR.Easy Image X在有些PE里不能运行的解决办法 xxwl2008 发表于 2013-1-26 11:58:38 https://www.itsk.com/threa ...

  9. 安装idea开发工具

    1.网上去下载一个安装包,有的是需要注册码的(可以网上搜索注册码) 2.设置快捷键,可以直接选择使用eclipse的快捷键 3.配置maven 4.配置Git 5.配置tomcat

  10. 两主机搭建MySQL主从复制后,show slave status显示:Last_IO_Error: error connecting to master ……

    两台主机A.B搭建mysql主从复制关系(A为master,B为slave)后,在slave上执行show slave status,结果中显示Last_IO_Error: error connect ...