思路: 将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. 21-React的学习

    # React的学习 React概述: React是一个用于构建用户界面的JavaScript库. React主要用于构建UI,很多人认为React是MVC中的V(视图). React起源于Faceb ...

  2. Oracle 截取字符串

    如下有一个创建函数的代码,是将一穿字符串按照逗号‘,’分割成若干段 create or replace function SplitStringByComma(aName in varchar2) r ...

  3. [转](六)unity4.6Ugui中文教程文档-------概要-UGUI Animation Integration

    5.Animation Integration(动画集成) 动画允许控件的所有状态之间相互转换,充分使用unity的动画系统.这是最强大的的转换模式的在处理很多属性的同时可以进行动画. 要使用动画转换 ...

  4. DOM笔记

    1.监听div内容修改 1.1 DOM2级中的mutation(变动事件)里的 DOMSubtreeModified 可以监听div内容修改 document.querySelector('.elem ...

  5. DSO的记录模式Record Mode字段测试

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. ie6、7 下input的边框问题 ?

    input的border设置为none,ie8及以上border都兼容,ie6和7的border还继续存在,将border设为0时所有浏览器上都不存在了,但是border为0时还是会继续的渲染. 将i ...

  7. bate阶段项目总结

    Beta里程碑总结 设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 要解决的问题是如何实现消息的发布与查看以及个人主页的实现:定义的基本清楚,团队 ...

  8. Mysql 5.7.12 配置

    打算用express+mysql写一个博客.本来在公司电脑已经配置好了的,但是为了方便在家里也能修改,所以在自己的电脑里也安装好环境. 公司电脑是win7系统32位的,安装的是5.5的mysql,用的 ...

  9. MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)

    本节继续讲解常用控件--按钮控件的使用. 按钮控件简介 按钮控件包括命令按钮(Button).单选按钮(Radio Button)和复选框(Check Box)等.命令按钮就是我们前面多次提到的侠义的 ...

  10. 【积累】validate验证框架的使用

    validate验证框架的使用:用验证框架可以很方便的验证前端页面输入的内容可以自定义验证方法 内容:0:环境搭建 1:基础用法 2:自定义用法 0:基本环境的搭建 0.1:下载js文件 0.2:引入 ...