题意:给定4个长度为N的字符串( N <= 100000),然后构成一个“中国结”,给定目标串,问能否从某个节点出发走一遍得到目标串,其中不能连续通过3个中心节点,也就是从字符串一个端点转移到其他端点后必须沿着这条字符串走。

分析:对4个字符串正反两面和目标串建立相应hash函数,然后暴力枚举每一个位置出发就可以了,可以有正反两个方向的走法。中间注意一下细节差不多就可以了。

代码:

 #include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
#define in freopen("F:\\rootial\\data\\data.txt", "r", stdin);
#define bug(x) printf("Line %d: >>>>>>\n", (x));
#define pb push_back
#define mp make_pair using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef vector<pair<int, int > > VII; const ULL seed = ; const int maxn = + ;
char s[][maxn], ta[maxn];
ULL hh[][maxn], tt[maxn], HH[maxn];
void pre()
{
tt[] = ;
for(int i = ; i < maxn; i++)
tt[i] = tt[i-]*seed;
}
int n, m;
VII ans;
bool dfs(int x, int pos, int dir, int len)
{
if(len == )
return true;
int len1 = n-pos+;
int mlen = min(len, len1);
int ok = ;
if(hh[x<<|dir][pos]-hh[x<<|dir][pos+mlen]*tt[mlen] == HH[m-len+]-HH[m-len+mlen+]*tt[mlen])
{
ok = ;
ans.pb(mp(x*n+(dir ? n+-pos : pos), dir));
len -= mlen;
if(len == )
return true;
for(int k = ; k < ; k++)
for(int j = ; j < ; j++)
{
if(k == x && (j^) == dir)
continue;
if(dfs(k, , j, len))
return true;
}
}
if(ok)
ans.pop_back();
return false;
}
int main()
{ pre();
int T;
for(int t(scanf("%d", &T)); t <= T; t++)
{
scanf("%d%d", &n, &m);
for(int i = ; i < ; i++)
scanf("%s", s[i]+);
scanf("%s", ta+);
for(int i = ; i < ; i++)
hh[i][n+] = ;
HH[m+] = ;
for(int i = ; i < ; i++)
{
for(int j = n; j >= ; j--)
{
hh[i<<][j] = hh[i<<][j+]*seed+(s[i][j]-'a');
hh[i<<|][j] = hh[i<<|][j+]*seed+(s[i][n+-j]-'a');
}
}
for(int i = m; i >= ; i--)
{
HH[i] = HH[i+]*seed+(ta[i]-'a');
}
int ok = ;
for(int k = ; k < ; k++)
{
for(int pos = ; pos <= n; pos++)
{
for(int j = ; j < ; j++)
{
ok = ;
ans.clear();
if(dfs(k, pos, j, m))
{
ok = ;
break;
}
if(ok)
break;
}
if(ok)
break;
}
if(ok)
{
break;
}
}
int ll = ;
if(ok)
{
for(int i = ; i < ans.size(); i++)
{
PII x = ans[i];
int st = x.first;
int dir = x.second;
int k = (st-)/n+; if(dir == )
{
for(int j = st; j <= k*n && ll < m; j++, ll++)
{
if(ll)
putchar(' ');
printf("%d", j);
}
}
else
{
for(int j = st; j > (k-)*n && ll < m; j--, ll++)
{
if(ll)
putchar(' ');
printf("%d", j);
}
}
}
cout<<endl;
}
else
{
puts("No solution!");
}
}
return ;
}

ZOJ 3817 Chinese Knot的更多相关文章

  1. 数学+高精度 ZOJ 2313 Chinese Girls' Amusement

    题目传送门 /* 杭电一题(ACM_steps 2.2.4)的升级版,使用到高精度: 这次不是简单的猜出来的了,求的是GCD (n, k) == 1 最大的k(1, n/2): 1. 若n是奇数,则k ...

  2. zoj 2313 Chinese Girls' Amusement 解题报告

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1313 题目意思:有 N 个人(编号依次为1~N)围成一个圆圈,要求求 ...

  3. ASC #1

    开始套题训练,第一套ASC题目,记住不放过每一题,多独立思考. Problem A ZOJ 2313 Chinese Girls' Amusement 循环节 题意:给定n,为圆环长度,求k < ...

  4. 使用MySQL数据库将汉字转换成拼音的一个C语言小程序

    环境: mysql:mysql-5.1.65 centos:centos 6.5 编译命令: gcc -o chinesetopinyin chinesetopinyin.c -L/usr/lib/m ...

  5. A - Chinese Girls' Amusement ZOJ - 2313(大数)

    You must have heard that the Chinese culture is quite different from that of Europe or Russia. So so ...

  6. ZOJ 3817Chinese Knot(The 2014 ACM-ICPC Asia Mudanjiang Regional First Round)

    思路: 将4个串每个串都反向这样得到新的四个串一共8个串,对于母串每个位置检测这个串能不能放进去,hs或者后缀数组都可以.然后dp[i][j]  (0<i<len  0<=j< ...

  7. ZOJ People Counting

    第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ  3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...

  8. CTRL-Space always toggles Chinese IME (Windows 7、10)

    一.window占用了ctrl+空格的快捷键,影响开发工具的只能提示的使用. 二.解决方式: Go to Start > Type in regedit and start it (打开运行输入 ...

  9. ZOJ 3686 A Simple Tree Problem

    A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a rooted tree, each no ...

随机推荐

  1. 从NSM到Parquet:存储结构的衍化

    http://blog.csdn.net/dc_726/article/details/41777661 为了优化MapReduce及MR之前的各种工具的性能,在Hadoop内建的数据存储格式外,又涌 ...

  2. Activti跳过中间节点的helloworld实例程序

    http://blog.csdn.net/songzheng_741/article/details/17289633 此实例是一个最简单的在运行时人为动态改变流程运转的实例,意在为任意流.驳回等功能 ...

  3. Android 6.0doze和standby 的一点理解

    之前写的压力测试程序,在开发版和5.0上面测试好好的,即使熄灭屏幕也会跑.我的程序主要是在Activity里面开启了一个thread,其中不断在界面上显示任务信息.换到6.0的 机器上面,发现一个现象 ...

  4. viewpager双层嵌套,子viewpager无限循环无法手动滑动

    项目中首页是用viewpager+fragment集成的,第一个fragment有广告轮播图使用viewpager实现的,开始就遇到是广告图无法手动滑动,事件被外层的viewpager拦截响应切换到下 ...

  5. Asp.net网页中禁止使用剪切、复制、粘贴的方法

    工欲善其事,必先利其器 在asp.net开发的网页中,有时候需要禁止用户粘贴复制密码,禁止用户copy文章直接粘贴到文本框中.采取的方法是直接在限制控件的地方写上禁止粘贴文本的代码.但是这样不是很方便 ...

  6. WebService开发常用功能详解

    一.WebService中常用的属性(Attributes)1. Web Service(Web服务)提供以下三个属性.    Namespace:此属性的值包含 XML Web Service的默认 ...

  7. HDOJ 1423 Greatest Common Increasing Subsequence -- 动态规划

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1423 Problem Description This is a problem from ZOJ 2 ...

  8. <<深入Java虚拟机>>-虚拟机类加载机制-学习笔记

    类加载的时机 遇到new.getstatic.putstatic或invokestatic这4个字节码指令时,如果类没有进行过初始化,则需要先触发其初始化.生成这4条指令最常见的Java场景是:使用n ...

  9. 1. Window环境下 - 开发环境的配置: (安装Android Studio 2.1)

    0. Java简介: 1990年Sun公司预料嵌入式系统将在未来家用电器领域大显生手, 于是成立了一个由James Gosling领导的"Green计划"(首席科学家Bill Jo ...

  10. python使用mysqldb连接数据库操作方法示例详解

    这篇文章主要介绍了python mysqldb使用方法,大家参考使用 复制代码代码如下: # -*- coding: utf-8 -*- #mysqldb  # site www.jbxue.com ...