ZOJ 3817Chinese Knot(The 2014 ACM-ICPC Asia Mudanjiang Regional First Round)
思路: 将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)的更多相关文章
- 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 ...
- 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 ...
- 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 ...
- The 2014 ACM-ICPC Asia Mudanjiang Regional First Round C
题意: 这个是The 2014 ACM-ICPC Asia Mudanjiang Regional First Round 的C题,这个题目当时自己想的很复杂,想的是优先队列广搜,然后再在 ...
- 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 ...
- 2014 ACM/ICPC Asia Regional Shanghai Online
Tree http://acm.hdu.edu.cn/showproblem.php?pid=5044 树链剖分,区间更新的时候要用on的左++右--的标记方法,要手动扩栈,用c++交,综合以上的条件 ...
- 2014 ACM/ICPC Asia Regional Guangzhou Online
Wang Xifeng's Little Plot http://acm.hdu.edu.cn/showproblem.php?pid=5024 预处理出每个点八个方向能走的最远距离,然后枚举起点,枚 ...
- 2014 ACM/ICPC Asia Regional Anshan Online
默默的签到 Osu! http://acm.hdu.edu.cn/showproblem.php?pid=5003 #include<cstdio> #include<algorit ...
- 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 ...
随机推荐
- 23-React Render Element
第23节 React Render Element 1.Element 元素是反应应用程序的最小积木. 元素描述你在屏幕上看到的内容.: const element= <h1>你好,世界& ...
- [OC] Podfile 格式内容
platform :ios, '8.0' target :'targetName' do pod 'Masonry', '~> 1.0.1' pod 'SDCycleScrollView', ' ...
- Cocos2d-x 核心概念 - 坐标系(UI.OpenGL.世界坐标系.模型坐标系)
UI坐标系与OpenGL坐标系 UI坐标就是Android和IOS等应用开发时候使用的二维坐标系,原点在左上角 OpenGL坐标是三维坐标,由于Cocos2d-x Lua 底层采用OpenGL渲染,因 ...
- WCF与WebService的区别
1.WebService:严格来说是行业标准,不是技术,使用XML扩展标记语言来表示数据(这个是夸语言和平台的关键).微软的Web服务实现称为ASP.NET Web Service.它使用Soap简单 ...
- CSS 如何使DIV层水平居中
今天用CSS碰到个很棘手的问题,DIV本身没有定义自己居中的属性, 网上很多的方法都是介绍用上级的text-align: center然后嵌套一层DIV来解决问题. 可是事实上这样的方法科学吗? 经过 ...
- jsp中jstl标签的类似 if - else 语句 的语法
在jsp中引入jstl的标签库和函数库 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c&q ...
- AWT编程学习01(未完成)
本文资料来源:<java疯狂讲义> 作者:李刚 终于要学习这一部分了~~虽然很多人(明明是绝大多数的人)说学这个没有用...而且有点过时了...但我觉得很有意思啊...感兴趣就学~~反正多 ...
- ThinkPHP的URL重写+路由+伪静态,实现SEO效果。
1.URL重写,隐藏网址中的Index.php. ThinkPHP 作为 PHP 框架,是单一入口的,那么其原始的 URL 便不是那么友好.但 ThinkPHP提供了各种机制来定制需要的 URL 格式 ...
- 使用Memcache缓存mysql数据库操作的原理和缓存过程浅析
转载自脚本之家 http://www.jb51.net/article/51831.htm 作者:忙碌的松鼠 对于大型网站如facebook,ebay等网站,如果没有Memcache做为中间缓存层, ...
- appium案例
import unittest from time import sleep from appium import webdriver import desired_capabilities clas ...