hdu4758 Walk Through Squares (AC自己主动机+DP)
Walk Through Squares
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 944 Accepted Submission(s): 277

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 divided into M*N squares which are of the same size. As shown in the figure below:
01--02--03--04
|| || || ||
05--06--07--08
|| || || ||
09--10--11--12
Consequently, we have (M+1)*(N+1) nodes, which are all connected to their adjacent nodes. And actual queue phalanx will go along the edges.
The ID of the first node,the one in top-left corner,is 1. And the ID increases line by line first ,and then by column in turn ,as shown in the figure above.
For every node,there are two viable paths:
(1)go downward, indicated by 'D';
(2)go right, indicated by 'R';
The current mission is that, each queue phalanx has to walk from the left-top node No.1 to the right-bottom node whose id is (M+1)*(N+1).
In order to make a more aesthetic marching, each queue phalanx has to conduct two necessary actions. Let's define the action:
An action is started from a node to go for a specified travel mode.
So, two actions must show up in the way from 1 to (M+1)*(N+1).
For example, as to a 3*2 rectangle, figure below:
01--02--03--04
|| || || ||
05--06--07--08
|| || || ||
09--10--11--12
Assume that the two actions are (1)RRD (2)DDR
As a result , there is only one way : RRDDR. Briefly, you can not find another sequence containing these two strings at the same time.
If given the N, M and two actions, can you calculate the total ways of walking from node No.1 to the right-bottom node ?
For each test cases,the first line contains two positive integers M and N(For large test cases,1<=M,N<=100, and for small ones 1<=M,N<=40). M denotes the row number and N denotes the column number.
The next two lines each contains a string which contains only 'R' and 'D'. The length of string will not exceed 100. We ensure there are no empty strings and the two strings are different.
2
3 2
RRD
DDR
3 2
R
D
1
10
5017 5016 5015
pid=5014" target="_blank">
5014
pid=5013" target="_blank">
5013
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define mod 1000000007
using namespace std;
int dp[110][110][210][4];
int m,n; int next[210][2],L,rt,end[210],fail[210];
inline int newnode(){
next[L][0]=next[L][1]=0;
end[L++]=0;
return L-1;
}
inline void init(){
L=0;
rt=newnode();
}
inline void insert(char *s,int z){
int l=strlen(s),x=rt;
for(int i=0;i<l;i++){
int z=(s[i]=='R' ? 0:1);
if(!next[x][z]) next[x][z]=newnode();
x=next[x][z];
}
end[x]=z;
}
inline void build(){
queue<int> q;
fail[0]=0;
for(int i=0;i<2;i++){
if(next[rt][i]!=0){
fail[next[rt][i]]=rt;
q.push(next[rt][i]);
}
}
while(!q.empty()){
int x=q.front();
q.pop();
end[x]|=end[fail[x]];//!!!!!
for(int i=0;i<2;i++){
if(next[x][i]==0){
next[x][i]=next[fail[x]][i];
}else{
fail[next[x][i]]=next[fail[x]][i];
q.push(next[x][i]);
}
}
}
}
char s[110];
inline void read(){
scanf("%d%d",&n,&m);
scanf("%s",s);
insert(s,1);
scanf("%s",s);
insert(s,2);
} inline void solve(){
build();
for(int i=1;i<=m+1;i++)for(int j=1;j<=n+1;j++)
for(int k=0;k<L;k++)for(int p=0;p<4;p++) dp[i][j][k][p]=0;
//memset(dp,0,sizeof dp);
dp[1][1][0][0]=1;
for(int i=1;i<=m+1;i++){
for(int j=1;j<=n+1;j++){
for(int k=0;k<L;k++){
for(int p=0;p<4;p++){
int z;
if(j>1){
z=next[k][0];
dp[i][j][z][end[z]|p]+=dp[i][j-1][k][p];
if(dp[i][j][z][end[z]|p]>mod) dp[i][j][z][end[z]|p]-=mod;
}
if(i>1){
z=next[k][1];
dp[i][j][z][end[z]|p]+=dp[i-1][j][k][p];
if(dp[i][j][z][end[z]|p]>mod) dp[i][j][z][end[z]|p]-=mod;
}
}
}
}
}
int ans=0;
for(int i=0;i<L;i++){
ans+=dp[m+1][n+1][i][3];
if(ans>mod) ans-=mod;
}
printf("%d\n",ans);
} int main(){
int t;
scanf("%d",&t);
for(int ca=1;ca<=t;ca++){
init();
read();
solve();
}
return 0;
}
/*
100 99
DRDDRD
DDRD
*/
hdu4758 Walk Through Squares (AC自己主动机+DP)的更多相关文章
- HDU - 4758 Walk Through Squares (AC自己主动机+DP)
Description On the beaming day of 60th anniversary of NJUST, as a military college which was Secon ...
- POJ 2778 DNA Sequence (AC自己主动机 + dp)
DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...
- HDU - 2825 Wireless Password(AC自己主动机+DP)
Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...
- Hdu 3341 Lost's revenge (ac+自己主动机dp+hash)
标题效果: 举个很多种DNA弦,每个字符串值值至1.最后,一个长字符串.要安排你最后一次另一个字符串,使其没事子值和最大. IDEAS: 首先easy我们的想法是想搜索的!管她3721..直接一个字符 ...
- poj 3691 DNA repair(AC自己主动机+dp)
DNA repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5877 Accepted: 2760 Descri ...
- hdu4057 Rescue the Rabbit(AC自己主动机+DP)
Rescue the Rabbit Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU4758 Walk Through Squares AC自动机&&dp
这道题当时做的时候觉得是数论题,包含两个01串什么的,但是算重复的时候又很蛋疼,赛后听说是字符串,然后就觉得很有可能.昨天队友问到这一题,在学了AC自动机之后就觉得简单了许多.那个时候不懂AC自动机, ...
- HDU - 4511 小明系列故事――女友的考验(AC自己主动机+DP)
Description 最终放寒假了,小明要和女朋友一起去看电影.这天,女朋友想给小明一个考验,在小明正准备出发的时候.女朋友告诉他.她在电影院等他,小明过来的路线必须满足给定的规则: 1.如果小明 ...
- Codeforces 86C Genetic engineering (AC自己主动机+dp)
题目大意: 要求构造一个串,使得这个串是由所给的串相连接构成,连接能够有重叠的部分. 思路分析: 首先用所给的串建立自己主动机,每一个单词节点记录当前节点可以达到的最长后缀. 開始的时候想的是dp[i ...
随机推荐
- Cocos2d-x 地图步行实现1:图论Dijkstra算法
下一节<Cocos2d-x 地图行走的实现2:SPFA算法>: http://blog.csdn.net/stevenkylelee/article/details/38440663 本文 ...
- 最小路径覆盖 hdu 1151 hdu 3335
Air Raid Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- iOS 在TabViewController中的一个ViewController跳转到另一种ViewController
第一步: #import "AppDelegate.h" 步骤二: 在须要跳转的地方: AppDelegate *appDelegate = (AppDelegate *)[[UI ...
- nyoj 117 找到的倒数 【树阵】+【分离】
这个问题的解决方案是真的很不错!!! 思路:建立一个结构体包括val和id. val就是输入的数,id表示输入的顺序.然后依照val从小到大排序.假设val相等.那么就依照id排序. 假设没有逆序的话 ...
- 在mac os下编译android -相关文章
1. Mac OS X下编译Android源码 http://blog.csdn.net/bulreed/article/details/22783467 2.MAC OS 编译 Android源代码 ...
- Jenkins(转)
1 修改jenkins的根目录,默认地在C:\Documents and Settings\AAA\.jenkins . .jenkins ├─jobs│ └─JavaHelloWorld│ ...
- effective c++ 条款26 postpone variable definition as long as possible
因为构造和析构函数有开销,所以也许前面定义了,还没用函数就退出了. 所以比较好的方法是用到了才定义.
- 浅谈http请求数据分析
前段时间,我一个朋友给我打了个电话.说是现在在搞网络销售,问我能不能帮他整个自动发帖机.说实在的,以前没有弄过这块,我就跟他讲我试试看吧,能不能成不能保证.毕竟是搞程序的嘛,自学的能力还是有滴.经过一 ...
- Lua之Lua数据结构-TTLSA(6)(转) good
一. tabletable是lua唯一的数据结构.table 是 lua 中最重要的数据类型. table 类似于 python 中的字典.table 只能通过构造式来创建.其他语言提供的其他数据结构 ...
- Linux(Centos)中tcpdump参数用法详解(转)
在linux下进行编程开发的人尤其是网络编程的人会经常需要分析数据包,那么一定会用到tcpdump,下面就是关于tcpdump的使用方法说明(1). tcpdump的选项 -a 将网络地址 ...