hdu 4758 Walk Through Squares(AC自动机+状态压缩DP)

题目链接:hdu 4758 Walk Through Squares

题意:

给你一个n*m的网格,现在你要从(1,1)走到(n,m),每次只能向右走或者向下走,走完后会形成一个包含R,D的序列,这个序列必须要包含题目给出的两个字符串,问有多少种方案。

题解:

由于要从(1,1)走到(n,m),所以这个形成的字符串包含R和D的数量是一定的。

现在考虑dp[u][i][j][k],表示包含两种串的组合状态,走了i个D,走了j个R,走到了k这个AC自动机的节点的方案数,然后dp一下就行了。复杂度为O(3*n*m*len(s1)*len(s2))

 1 #include<bits/stdc++.h>
 2 #define mst(a,b) memset(a,b,sizeof(a))
 3 #define F(i,a,b) for(int i=(a);i<=(b);++i)
 4 using namespace std;
 5
 6 const int AC_N=300+7,tyn=2;
 7 int t,n,m,dp[4][111][111][212],P=1e9+7,ans;
 8 char a[101],b[101];
 9 inline void up(int &a,int b){a=(a+b)%P;}
10
11 struct AC_automation{
12     int tr[AC_N][tyn],cnt[AC_N],Q[AC_N],fail[AC_N],tot;
13     inline int getid(char x){
14         if(x==‘D‘)return 0;
15         return 1;
16     }
17     void nw(){cnt[++tot]=0,fail[tot]=0;mst(tr[tot],0);}
18     void init(){tot=-1,fail[0]=-1,nw();}
19     void insert(char *s,int idx,int x=0){
20         for(int len=strlen(s),i=0,w;i<len;x=tr[x][w],i++)
21             if(!tr[x][w=getid(s[i])])nw(),tr[x][w]=tot;
22         cnt[x]=1<<idx;
23     }
24     void build(int head=1,int tail=0){
25         for(int i=0;i<tyn;i++)if(tr[0][i])Q[++tail]=tr[0][i];
26         while(head<=tail)for(int x=Q[head++],i=0;i<tyn;i++)
27             if(tr[x][i])
28             {
29                 fail[tr[x][i]]=tr[fail[x]][i],Q[++tail]=tr[x][i];
30                 cnt[tr[x][i]]|=cnt[tr[fail[x]][i]];
31             }
32             else tr[x][i]=tr[fail[x]][i];
33     }
34     void solve()
35     {
36         mst(dp,0),dp[0][0][0][0]=1;
37         F(u,0,3)F(i,0,n)F(j,0,m)F(k,0,tot)
38         {
39             if(!dp[u][i][j][k])continue;
40             up(dp[u|cnt[tr[k][0]]][i+1][j][tr[k][0]],dp[u][i][j][k]);
41             up(dp[u|cnt[tr[k][1]]][i][j+1][tr[k][1]],dp[u][i][j][k]);
42         }
43         ans=0;
44         F(k,0,tot)up(ans,dp[3][n][m][k]);
45         printf("%d\n",ans);
46     }
47 }AC;
48
49
50 int main()
51 {
52     scanf("%d",&t);
53     while(t--)
54     {
55         scanf("%d%d%s%s",&m,&n,a,b);
56         AC.init(),AC.insert(a,0),AC.insert(b,1);
57         AC.build(),AC.solve();
58     }
59     return 0;
60 }

时间: 2024-10-13 21:19:02

hdu 4758 Walk Through Squares(AC自动机+状态压缩DP)的相关文章

HDU 3341 Lost&#39;s revenge AC自动机+ 状态压缩DP

题意:这个题目和HDU2457有点类似,都是AC自动机上的状态dp,题意就是给你只含有'A','T','C','G',四个字符的子串和文本串,问你文本串如何排列才可以使得文本串中包含有更多的模式串 解题思路:我们知道了 有 num[0] 个 'A', num[1] 个 ‘T’, num[2] 个 ‘C’,num[3] 个‘G’, 我们的可以知道暴力的思路就是把所有的文本串都枚举出来然后一一匹配.我们膜拜了一下春哥以后,就可以有以下思路:  把一个串的信息压缩一下,把具有同样个数字符的串看成是同一

HDU 2825 Wireless Password (AC自动机 + 状态压缩DP)

题目链接:Wireless Password 解析:给 m 个单词构成的集合,统计所有长度为 n 的串中,包含至少 k 个单词的方案数. AC自动机 + 状态压缩DP. DP[i][j][k]:长度为i的字符串匹配到状态j且包含k个magic word的可能字符串个数. AC代码: #include <algorithm> #include <iostream> #include <cstdio> #include <queue> #include <

HDU - 4758 Walk Through Squares (AC自动机+DP)

Description On the beaming day of 60th anniversary of NJUST, as a military college which was Second Artillery Academy of Harbin Military Engineering Institute before, queue phalanx is a special landscape. Here is a M*N rectangle, and this one can be

HDU - 4758 Walk Through Squares (AC自己主动机+DP)

Description On the beaming day of 60th anniversary of NJUST, as a military college which was Second Artillery Academy of Harbin Military Engineering Institute before, queue phalanx is a special landscape. Here is a M*N rectangle, and this one can be

hdu 4057 AC自动机+状态压缩dp

http://acm.hdu.edu.cn/showproblem.php?pid=4057 Problem Description Dr. X is a biologist, who likes rabbits very much and can do everything for them. 2012 is coming, and Dr. X wants to take some rabbits to Noah's Ark, or there are no rabbits any more.

HDU 4511 (AC自动机+状态压缩DP)

题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4511 题目大意:从1走到N,中间可以选择性经过某些点,比如1->N,或1->2->N,但是某些段路径(注意不是某些条)是被禁止的.问从1->N的最短距离. 解题思路: AC自动机部分: 如果只是禁掉某些边,最短路算法加提前标记被禁的边即可. 但是本题是禁掉指定的路段,所以得边走边禁,需要一个在线算法. 所以使用AC自动机来压缩路段,如禁掉的路段是1->2->3,那么in

POJ 3691 (AC自动机+状态压缩DP)

题目链接:  http://poj.org/problem?id=3691 题目大意:给定N的致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题思路: 首先说一下AC自动机在本题中的作用. ①字典树部分:负责判断当前0~i个字符组成的串是否包含致病DNA,这部分靠字典树上的cnt标记完成. ②匹配部分:主要依赖于匹配和失配转移关系的计算,这部分非常重要,用来构建不同字符间状态压缩的转移关系(代替反人类的位运算). 这也是必须使用AC自动机而

【HDU3341】AC自动机状态压缩DP,或者说hash枚举DP,-------出题人卡常数都是狗!!!!!

题意:给若干种个串,再给个主串,然后把主串打乱顺序,使得包含子串尽量多(一种可以有多个,两个之间可以部分重叠).如第一组数据,ACGT,包含AC.CG.GT,三个,输出3.第二组数据A1A2A3,包含A1A2和A2A3两个"AA",答案为2. 其实我并没有AC.我被卡常数TLE了...实在不想写这种没意义的东西了. 贴代码,待填坑. #include <queue> #include <cstdio> #include <cstring> #incl

hdu4758AC自动机+状态压缩DP

http://acm.hdu.edu.cn/showproblem.php?pid=4758 Problem Description On the beaming day of 60th anniversary of NJUST, as a military college which was Second Artillery Academy of Harbin Military Engineering Institute before, queue phalanx is a special l