题意:给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的更多相关文章

  1. HDU4758 Walk Through Squares(AC自动机+状压DP)

    题目大概说有个n×m的格子,有两种走法,每种走法都是一个包含D或R的序列,D表示向下走R表示向右走.问从左上角走到右下角的走法有多少种走法包含那两种走法. D要走n次,R要走m次,容易想到用AC自动机 ...

  2. hdu4758 Walk Through Squares (AC自己主动机+DP)

    Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...

  3. hdu4758 Walk Through Squares

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=4758 题目: Walk Through Squares Time Limit: 4000/20 ...

  4. HDU4758 Walk Through Squares AC自动机&&dp

    这道题当时做的时候觉得是数论题,包含两个01串什么的,但是算重复的时候又很蛋疼,赛后听说是字符串,然后就觉得很有可能.昨天队友问到这一题,在学了AC自动机之后就觉得简单了许多.那个时候不懂AC自动机, ...

  5. HDU3341 Lost's revenge(AC自动机&&dp)

    一看到ACGT就会想起AC自动机上的dp,这种奇怪的联想可能是源于某道叫DNA什么的题的. 题意,给你很多个长度不大于10的小串,小串最多有50个,然后有一个长度<40的串,然后让你将这个这个长 ...

  6. 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 ...

  7. POJ1625 Censored!(AC自动机+DP)

    题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...

  8. HDU2296 Ring(AC自动机+DP)

    题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...

  9. HDU2457 DNA repair(AC自动机+DP)

    题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...

随机推荐

  1. NDK/JNI学习--进口hello-jniproject

    上一篇文章,简单的设置NDK开发环境,本文通过导入C:\android-ndk-r9d\samples\hello-jni(NDK自带example)来疏通真个环境. 打开Eclipse IDE.指定 ...

  2. Windows 2008 配置ASP+ACCESS环境(亲身体会)

    我们公司OA系统是用asp开发的,时间有些长了,原来只是公司总部,部署到内网就可以了,现在要求全国各地的分公司也要用,而且接入了56短网的短信接口(http://www.56dxw.com),主要起到 ...

  3. oracle查询和编写数据字典

    在项目交付时假设须要编写数据字典,能够採用以下的方法.首先执行以下的sql语句 SELECT A.TABLE_NAME AS 表名, A.COLUMN_NAME AS 字段名, DECODE(A.CH ...

  4. 如何设置多个同一页的tinymce编辑

    的页面设置多个tinymce编辑器 This example shows how to setup multiple editors on the same page and with differe ...

  5. js+html+css简单的互动功能页面(2015知道几乎尖笔试题)http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html?from=y1.7-1.2

    js+html+css实现简单页面交互功能(2015知乎前端笔试题) http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html? from=y1.7-1. ...

  6. 【原创】纯OO:从设计到编码写一个FlappyBird (五)

    第四部分请点这里 本文将实现DrawBoard. 如前文所述,Obstacle类和Bing类仅仅提供给DrawBoard必要的信息,如何绘制则完全委托给了DrawBoard,也就是说游戏关键类的细节和 ...

  7. Web静态和动态项目委托代理基于面向方面编程AOP

    本来每天更新,我一般喜欢晚上十二点的时候发文章,结果是不是愚人节?校内网也将是非常有趣,破,把我给打. ..好吧-从今天开始的话题AOP.AOP太重要了,所以把第二篇文章谈论这个话题,AOP它是Spr ...

  8. WebxFrameworkFilter 请求响应过程

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTFRpYW5jaGFv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  9. 调用CachedRowSetImpl类时,为什么会出现这样的错误

    Access restriction: The type CachedRowSetImpl is not accessible due to restriction on required libra ...

  10. 卓尼斯ZT-180点评

    卓尼斯ZT-180点评    ——我们出差,使用10”上网本发布,没有图片.并写冲忙.遗憾的不足之处. 一.购买 1.由于旅游.不想拿那台14"笔记本,台平板电脑.当时,选择的对象有维智A8 ...