hdu4758 Walk Through Squares 自动机+DP
题意:给n*m的地图,在地图的点上走,(n+1)*(m+1)个点,两种操作:往下走D和往右走R。现在要从左上角走到右下角,给定两个操作串,问包含这两个串的走法总共有多少种。
做法:用这两个串构建自动机,然后只要在自动机上走n+m+1步就好了。就像一个递推,dp[x][y][i][cur]表示在i状态到达x,y坐标时走过的串的状态为cur时的总方案数
我和我的小伙伴们都弱爆了。
为什么没写过就不敢写。
这几天看自动机应该也看会了吧。
#define mod 1000000007 int f[][][][] ;
int hash[];
int n,m;
struct ACmation {
static const int UNDEF = ;
static const int MAXN = ;
static const int CHARSET = ; int end;
int count[MAXN];
int fail[MAXN];
int ch[MAXN][CHARSET]; void init() {
count[] = UNDEF;
fill(ch[], ch[] + CHARSET, -);
end = ;
} void add(int m, const int* s, int t) {
int p = ;
for (int i = ; i < m; ++i) {
if (ch[p][*s] == -) {
count[end] = UNDEF;
fill(ch[end], ch[end] + CHARSET, -);
ch[p][*s] = end++;
}
p = ch[p][*s];
++s;
}
count[p] |= t;
} void build() {
queue<int> bfs;
fail[] = ;
for (int i = ; i < CHARSET; ++i) {
if (ch[][i] != -) {
fail[ch[][i]] = ;
bfs.push(ch[][i]);
} else {
ch[][i] = ;
}
}
while (!bfs.empty()) {
int p = bfs.front();
count[p] |= count[fail[p]];
bfs.pop();
for (int i = ; i < CHARSET; ++i) {
if (ch[p][i] != -) {
fail[ch[p][i]] = ch[fail[p]][i];
bfs.push(ch[p][i]);
} else {
ch[p][i] = ch[fail[p]][i];
}
}
}
}
int solve()
{
memset(f,,sizeof(f));
f[][][count[]][] = ;
int tmp ;
for(int x = ; x <= n ; x ++ )
{
for(int y = ; y <= m; y ++ )
{
for(int i = ; i < end; i ++ )
{
for(int cur = ; cur < ; cur ++ )
{
//printf("count[i] = %d\n",count[i]);
if(x + <= n )
{
tmp = cur | count[ch[i][]];
f[x+][y][ch[i][]][tmp] = (f[x][y][i][cur] + f[x+][y][ch[i][]][tmp] ) % mod;
// printf("%d %d %d %d %d\n",x+1,y,ch[i][0],tmp,f[x+1][y][ch[i][0]][tmp]);
}
if(y + <= m )
{
tmp = cur | count[ch[i][]];
f[x][y+][ch[i][]][tmp] = (f[x][y][i][cur] + f[x][y+][ch[i][]][tmp] ) % mod;
//printf("%d %d %d %d %d\n",x,y+1,ch[i][0],tmp,f[x][y+1][ch[i][0]][tmp]);
}
}
}
}
}
int res;
res = ;
for(int i = ; i < end ; i ++ )
{
res = (f[n][m][i][] + res) % mod ;
}
return res % mod ;
}
} ac;
char str[];
int len ;
int te[];
int main()
{
int cas;
memset(hash,-,sizeof(hash));
hash['D'] = ;
hash['R'] = ;
scanf("%d",&cas);
while(cas -- )
{
scanf("%d%d",&m,&n);
ac.init();
for(int k = ; k < ; k ++ )
{
scanf("%s",str);
len = strlen(str);
for(int i = ; i < len ; i ++ )
te[i] = hash[str[i]];
ac.add(len,te,<<k);
} ac.build();
int ans ;
ans = ac.solve();
printf("%d\n",ans);
}
return ;
}
hdu4758 Walk Through Squares 自动机+DP的更多相关文章
- HDU4758 Walk Through Squares(AC自动机+状压DP)
题目大概说有个n×m的格子,有两种走法,每种走法都是一个包含D或R的序列,D表示向下走R表示向右走.问从左上角走到右下角的走法有多少种走法包含那两种走法. D要走n次,R要走m次,容易想到用AC自动机 ...
- hdu4758 Walk Through Squares (AC自己主动机+DP)
Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...
- hdu4758 Walk Through Squares
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=4758 题目: Walk Through Squares Time Limit: 4000/20 ...
- HDU4758 Walk Through Squares AC自动机&&dp
这道题当时做的时候觉得是数论题,包含两个01串什么的,但是算重复的时候又很蛋疼,赛后听说是字符串,然后就觉得很有可能.昨天队友问到这一题,在学了AC自动机之后就觉得简单了许多.那个时候不懂AC自动机, ...
- HDU3341 Lost's revenge(AC自动机&&dp)
一看到ACGT就会想起AC自动机上的dp,这种奇怪的联想可能是源于某道叫DNA什么的题的. 题意,给你很多个长度不大于10的小串,小串最多有50个,然后有一个长度<40的串,然后让你将这个这个长 ...
- HDU 4758 Walk Through Squares (2013南京网络赛1011题,AC自动机+DP)
Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
- POJ1625 Censored!(AC自动机+DP)
题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...
- HDU2296 Ring(AC自动机+DP)
题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...
- HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
随机推荐
- The example program of C on point
计划一: #include<stdio.h> #define N_VALUES 5 int main( void ) { float values[N_VALUES]; float *vp ...
- android 项目中设置背景图片
xml文件设置背景图片中:任意一个控件,button imageView 或layout,在其的xml属性设置中,添加 [XML] view plaincopy android:background= ...
- 记View跨界平局
<?xml version="1.0" encoding="utf-8"? > <RelativeLayout xmlns:android=& ...
- Cocos2d-x学习笔记(五岁以下儿童) 精灵两种方式播放动画
这几天在看控件类,临时没有想好实际运用的方向.单纯的创建网上已经有非常多这方面的样例,我就不写了.接下来是学习精灵类.精灵类若是单独学习也是非常easy.于是我加了一些有关动画方面的知识点与精灵 ...
- CSU 1659: Graph Center(SPFA)
1659: Graph Center Time Limit: 1 Sec Memory Limit: 128 MB Submit: 63 Solved: 25 [id=1659"> ...
- Singleton模式线程相关的(C\C++)
这种需求的最新发展. 我需要一个静态类,无论地方,我可以在线程中调用它public功能对应的功能已经完成. 这个静态类会调用我初始化给它的一个指针,这个指针是与线程一一相应的: 准确来说这样的模式应该 ...
- 找呀志_java网络编程(4)TCP/IP、Http和Socket差额
经java网络编程(1)网络体系结构及通信协议我知道IP协议相应于网络层.TCP协议相应于传输层.而HTTP协议相应于应用层, 三者从本质上来说没有可比性 TPC/IP协议是传输层协议,主要解决数据怎 ...
- Android - 支持不同的设备 - 支持不同的语言
把app的字符串放到另外一个文件中是一个好习惯.Android用android工程中的资源文件夹让这件事变的很简单. 如果使用Android SDK Tools创建工程,这个工具会在工程的根目录下创建 ...
- 第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器
原文:第十九章--使用资源调控器管理资源(2)--使用T-SQL配置资源调控器 前言: 在前一章已经演示了如何使用SSMS来配置资源调控器.但是作为DBA,总有需要写脚本的时候,因为它可以重用及扩展. ...
- Jg-Table 过程1 (jgTable)
近期使用Table,他写了一.时间紧急.还有一点简单的无精写作.但主要的功能已经支持, 大家有时间可以看看,欢迎吐槽 jg-table 1.0 1. 支持固定头角 ...