BZOJ4572: [Scoi2016]围棋
Description
Input
Output
输出应包含q行,每行一个整数,表示符合要求的棋盘数量。由于答案可能很大,你只需要输出答案对1,000,000,007取模后的结果即可。
Sample Input
B
W
B
B
Sample Output
5
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
using namespace std;
inline int read() {
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
typedef long long ll;
const int mod=1000000007;
char id[2333];
void Add(int& x,int y) {x+=y;if(x>=mod) x-=mod;}
int to1[8][3],to2[8][3];
void init(char* A,int* f,int c,int tp) {
id['W']='0';id['B']='1';id['X']='2';
rep(i,0,c-1) A[i]=id[A[i]];
rep(i,1,c-1) {
int j=f[i];
while(j&&A[i]!=A[j]) j=f[j];
f[i+1]=A[i]==A[j]?j+1:0;
}
rep(i,0,c) rep(k,0,2) {
int j=i;
while(j&&A[j]!=k+'0') j=f[j];
if(A[j]==k+'0') j++;
if(tp) to2[i][k]=j;
else to1[i][k]=j;
}
}
int n,m,c,f[2][1<<12][8][8],tmp[8];
char A[8],B[8];
void solve() {
int cur=0;scanf("%s%s",A,B);
init(A,tmp,c,0);init(B,tmp,c,1);
memset(f,0,sizeof(f));f[0][0][0][0]=1;
rep(x,1,n) rep(y,1,m) {
cur^=1;memset(f[cur],0,sizeof(f[cur]));
rep(S,0,(1<<m)-1) rep(i,0,c) rep(j,0,c) {
int& res=f[cur^1][S][i][j];if(!res) continue;
rep(k,0,2) {
int nx=to1[i][k],ny=to2[j][k],nS=S<<1;
if(nS>>m&1) nS^=(1<<m);if(nx==c) nS^=1;
if(y>=c&&ny==c&&(S>>(m-1)&1)) continue;
Add(f[cur][nS][nx][ny],res);
}
}
}
int ans=1;rep(i,1,n*m) ans=(ll)ans*3%mod;
rep(S,0,(1<<m)-1) rep(i,0,c) rep(j,0,c) Add(ans,mod-f[cur][S][i][j]);
printf("%d\n",ans);
}
int main() {
n=read();m=read();c=read();
dwn(T,read(),1) solve();
return 0;
}
BZOJ4572: [Scoi2016]围棋的更多相关文章
- 2019.03.25 bzoj4572: [Scoi2016]围棋(轮廓线dp)
传送门 题解可以参见zjjzjjzjj神仙的,写的很清楚. 代码: #include<bits/stdc++.h> #define ri register int using namesp ...
- 【bzoj4572 scoi2016】围棋
题目描述 近日,谷歌研发的围棋AI—AlphaGo以4:1的比分战胜了曾经的世界冠军李世石,这是人工智能领域的又一里程碑. 与传统的搜索式AI不同,AlphaGo使用了最近十分流行的卷积神经网络模型. ...
- [SCOI2016]围棋
Description 近日,谷歌研发的围棋AI-AlphaGo以4:1的比分战胜了曾经的世界冠军李世石,这是人工智能领域的又一里程碑.与传统的搜索式AI不同,AlphaGo使用了最近十分流行的卷积神 ...
- BZOJ.4572.[SCOI2016]围棋(轮廓线DP)
BZOJ 洛谷 \(Description\) 给定\(n,m,c\).\(Q\)次询问,每次询问给定\(2*c\)的模板串,求它在多少个\(n*m\)的棋盘中出现过.棋盘的每个格子有三种状态. \( ...
- 4572: [Scoi2016]围棋 轮廓线DP KMP
国际惯例的题面:这种题目显然DP了,看到M这么小显然要状压.然后就是具体怎么DP的问题.首先我们可以暴力状压上一行状态,然后逐行转移.复杂度n*3^m+3^(m*2),显然过不去. 考虑状态的特殊性, ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 一类巧妙利用利用失配树的序列DP
I.导入 求长度为\(\text{len}\)的包含给定连续子串\(\text{T}\)的 0/1 串的个数.(\(|T|<=15\)) 通常来说这种题目应该立刻联想到状压 DP 与取反集--这 ...
- 「SCOI2016」围棋 解题报告
「SCOI2016」围棋 打CF后困不拉基的,搞了一上午... 考虑直接状压棋子,然后发现会t 考虑我们需要上一行的状态本质上是某个位置为末尾是否可以匹配第一行的串 于是状态可以\(2^m\)压住了, ...
- 【LOJ】#2017. 「SCOI2016」围棋
题解 考虑到状态数比较复杂,其实我们需要轮廓线dp-- 我们设置\(f[x][y][S][h][k]\)为考虑到第(x,y)个格子,S是轮廓线上的匹配状态,是二进制,如果一位是1表示这一位匹配第一行匹 ...
随机推荐
- Solr学习总结(四)Solr查询参数
今天还是不会涉及到.Net和数据库操作,主要还是总结Solr 的查询参数,还是那句话,只有先明白了solr的基础内容和查询语法,后续学习solr 的C#和数据库操作,都是水到渠成的事.这里先列出sol ...
- 广播接收者Receiver
一,动态创建网络状态监控 思路: 1:需要注册一个广播接收者,registerReceiver()需要两个参数 public Intent registerReceiver( BroadcastRec ...
- GIT本地配置和PUSH
因为GIT使用的是LINUX命令,所以可以参考LINUX的相关命令 一.在本地配置好GIT仓库: 1.首先进入当前工程的目录:cd [filepath] (记住这里的目录应该用/,因为LINUX是这样 ...
- [UML]UML系列——类图Class
相关文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) 一.类图的概念及组成 1.类图的概念 类图是描述类.接 ...
- golang笔记——array
1.定义一个 array 数组长度也是类型的一部分,比如长度为3的int数组与长度为5的int数组,并不是同一类型. package main import ( "strconv" ...
- 大熊君JavaScript插件化开发------(实战篇之DXJ UI ------ Tab功能扩展完结版)
一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得上一篇文章吗.主要讲述了一个“Tab”插件是如何组织代码以及实现的”,以及过程化设计与面向对象思想设计相结合的方式是 如何设计一个插件的,两种方 ...
- bzoj1491 社交网络
Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这 ...
- Hadoop-HBASE案例分析-Hadoop学习笔记<二>
之前有幸在MOOC学院抽中小象学院hadoop体验课. 这是小象学院hadoop2.X概述第八章的笔记 主要介绍HBase,一个分布式数据库的应用案例. 案例概况: 1)时间序列数据库(OpenTSD ...
- [Scala] 快学Scala A1L1
基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...
- Linux的用户及用户组
一./etc/group下存储当前系统中所有的用户组信息 -Group: x : 123 :abc,def,xyz -组名称:组密码占位符:组编号:组中用户名列表 二./etc/gshado ...