题解

考虑到状态数比较复杂,其实我们需要轮廓线dp……

我们设置\(f[x][y][S][h][k]\)为考虑到第(x,y)个格子,S是轮廓线上的匹配状态,是二进制,如果一位是1表示这一位匹配第一行匹配到第一行的末尾了,然后h是前一个格子匹配到第一行第h列,k是前一个格子匹配到第二行第k列,转移数组用kmp求出来,就是第几列,往下匹配一个字符能最远转移到哪

然后转移就可以了,如果下一次能匹配到末尾,那么S这一位就设成1,如果不能,S这一位就设成0

注意如果这个格子是一行的起始,需要特殊转移,强制是从匹配到第0列转移过来

代码

#include <bits/stdc++.h>
//#define ivorysi typedef long long int64;
typedef unsigned int u32;
using namespace std;
int n,m,c,Q;
char A[15],B[15],ch[5];
int to[2][15][4],nx[15];
int f[2][1 << 12][7][7];
const int MOD = 1000000007;
void kmp(char *s,int id) {
nx[1] = 0;
for(int i = 2 ; i <= c; ++i) {
int p = nx[i - 1];
while(p && s[p + 1] != s[i]) p = nx[p];
if(s[p + 1] == s[i]) nx[i] = p + 1;
else nx[i] = 0;
}
for(int i = 0 ; i <= c ; ++i) {
for(int j = 1 ; j <= 3 ; ++j) {
int p = i;
while(p && s[p + 1] != ch[j]) p = nx[p];
if(s[p + 1] == ch[j]) to[id][i][j] = p + 1;
else to[id][i][j] = 0;
}
}
}
void Init() {
scanf("%s%s",A + 1,B + 1);
kmp(A,0);kmp(B,1);
}
void update(int &x,int y) {
x = (x + y) % MOD;
}
int fpow(int x,int c) {
int res = 1,t = x;
while(c) {
if(c & 1) res = 1LL * res * t % MOD;
t = 1LL * t * t % MOD;
c >>= 1;
}
return res;
}
void Solve() {
ch[1] = 'B';ch[2] = 'W';ch[3] = 'X';
scanf("%d%d%d%d",&n,&m,&c,&Q);
while(Q--) {
Init();
int cur = 0;
memset(f[cur],0,sizeof(f[cur]));
f[cur][0][0][0] = 1;
int res = fpow(3,n * m);
for(int i = 1 ; i <= n ; ++i) {
for(int j = 1 ; j <= m ; ++j) {
memset(f[cur ^ 1],0,sizeof(f[cur ^ 1]));
for(int S = 0 ; S < 1 << m ; ++S) {
for(int h = 0 ; h <= c ; ++h) {
for(int k = 0 ; k <= c ; ++k) {
int x = f[cur][S][h][k];
if(!x) continue;
for(int l = 1 ; l <= 3 ; ++l) {
int nx = to[0][h][l];
if(j == 1) nx = to[0][0][l];
int ny = to[1][k][l];
if(j == 1) ny = to[1][0][l];
int nS = S;
if((S>> j - 1 & 1) && ny == c) continue;
if(nx == c) {
if(!(nS >> j - 1 & 1)) nS ^= 1 << j - 1;
}
else {
if(nS >> j - 1 & 1) nS ^= 1 << j - 1;
}
if(i == n && j == m) update(res,MOD - x);
else update(f[cur ^ 1][nS][nx][ny],x);
}
}
}
}
cur ^= 1;
}
}
printf("%d\n",res);
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

【LOJ】#2017. 「SCOI2016」围棋的更多相关文章

  1. 「SCOI2016」围棋 解题报告

    「SCOI2016」围棋 打CF后困不拉基的,搞了一上午... 考虑直接状压棋子,然后发现会t 考虑我们需要上一行的状态本质上是某个位置为末尾是否可以匹配第一行的串 于是状态可以\(2^m\)压住了, ...

  2. loj#2013. 「SCOI2016」幸运数字 点分治/线性基

    题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...

  3. loj#2015. 「SCOI2016」妖怪 凸函数/三分

    题目链接 loj#2015. 「SCOI2016」妖怪 题解 对于每一项展开 的到\(atk+\frac{dnf}{b}a + dnf + \frac{atk}{a} b\) 令$T = \frac{ ...

  4. loj#2016. 「SCOI2016」美味

    题目链接 loj#2016. 「SCOI2016」美味 题解 对于不带x的怎么做....可持久化trie树 对于带x,和trie树一样贪心 对于答案的二进制位,从高往低位贪心, 二进制可以表示所有的数 ...

  5. loj#2012. 「SCOI2016」背单词

    题目链接 loj#2012. 「SCOI2016」背单词 题解 题面描述有点不清楚. 考虑贪心 type1的花费一定不会是优的,不考虑, 所以先把后缀填进去,对于反串建trie树, 先填父亲再填儿子, ...

  6. loj #2013. 「SCOI2016」幸运数字

    #2013. 「SCOI2016」幸运数字 题目描述 A 国共有 n nn 座城市,这些城市由 n−1 n - 1n−1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以 ...

  7. [LOJ#2017][轮廓线DP][KMP]「SCOI2016」围棋

    题目传送门 看到 \(m\le 12\) 和 \(c\le 6\) ,容易想到状压 DP 考虑转化成 \(3^{nm}\) 减去不合法的方案数,轮廓线 DP :\(f[i][j][S][k][h]\) ...

  8. LOJ #2013「SCOI2016」幸运数字

    时限为什么这么大啊 明摆着放多$ log$的做法过啊$QAQ$ LOJ #2013 题意 有$ Q$次询问,每次询问树上一条链,点有点权,你需要选择一些链上的点使得异或和尽量大 点数$ \leq 2* ...

  9. LOJ#2015. 「SCOI2016」妖怪(凸包)

    传送门 首先可以把每个妖怪看成二维平面上的一个点,那么每一个环境\((a,b)\)就可以看成一条斜率\(k=-\frac{b}{a}\)的过该点的直线,战斗力就是这条直线在两坐标轴上的截距之和 对于每 ...

随机推荐

  1. AI技术说:人工智能相关概念与发展简史

    作为近几年的一大热词,人工智能一直是科技圈不可忽视的一大风口.随着智能硬件的迭代,智能家居产品逐步走进千家万户,语音识别.图像识别等AI相关技术也经历了阶梯式发展.如何看待人工智能的本质?人工智能的飞 ...

  2. 配置:heartbeat+nginx+mysqld+drbd高可用笔记(OK)

    参考资料:http://www.centoscn.com/CentosServer/cluster/2015/0605/5604.html   背景需求: 使用heartbeat来做HA高可用,并且把 ...

  3. 微信小程序踩过的坑

    之前用小程序开发工具做过一个项目了,最近又新开了一个项目,在登录的时候发现总是提示code不合法,找了半天也未发现原因 后来同事提醒是不是因为开发工具里设置的AppId的问题,果断将当前工具里默认Ap ...

  4. linux下怎么查找文件

    linux下通常用whereis或者是locate来检查文件,如果实在找不到,才使用find.为什么find不能作为优先考虑的命令? 因为whereis与locate是利用数据库来查找数据,所以相当快 ...

  5. python---tornado补充(异步非阻塞)

    一:正常访问(同一线程中多个请求是同步阻塞状态) import tornado.ioloop import tornado.web import tornado.websocket import da ...

  6. Spring Boot + Swagger

    前言: 在互联网公司, 微服务的使用者一般分为两种, 客户端和其他后端项目(包括关联微服务),不管是那方对外提供文档 让别人理解接口 都是必不可少的.传统项目中一般使用wiki或者文档, 修改繁琐,调 ...

  7. [洛谷P1709] [USACO5.5]隐藏口令Hidden Password

    洛谷题目链接:[USACO5.5]隐藏口令Hidden Password 题目描述 有时候程序员有很奇怪的方法来隐藏他们的口令.Binny会选择一个字符串S(由N个小写字母组成,5<=N< ...

  8. JS操作CSS随机改变网页背景

    今天有个朋友在weibo上问我可不可以用JS和CSS让页面每次刷新随机产生一张背景图,当然我的回答是可以的.具体可以这样做: 1.用JS定义一个图片数组,里面存放你想要随机展示的图片 1 2 3 4 ...

  9. IO流-文件拷贝

    其实文件的拷贝还是文件读取写入的应用,实际是读取此路径上的文件,然后写入到指定路径下的文件. 代码举例: import java.io.*; import java.lang.*; class Tes ...

  10. 20155117王震宇 2016-2017-2 《Java程序设计》第十周学习总结

    教材学习内容总结 Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd) 第22章 网络 {{屏幕快照 2017-04-30 下午8.38.06.pn ...