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 ...
随机推荐
- oracle spfile和pfile文件(转)
--======================== -->Oracle 参数文件 --======================== /* 参数文件(10g中的参数文件) 主要用来记录数据库 ...
- NYOJ 45 棋盘覆盖 模拟+高精度
题意就不说了,中文题... 小白上讲了棋盘覆盖,于是我就挖了这题来做. 棋盘覆盖的推导不是很难理解,就是分治的思想,具体可以去谷歌下. 公式就是f(k) = f(k - 1) * 4 + 1,再化解下 ...
- NDK/JNI学习--进口hello-jniproject
上一篇文章,简单的设置NDK开发环境,本文通过导入C:\android-ndk-r9d\samples\hello-jni(NDK自带example)来疏通真个环境. 打开Eclipse IDE.指定 ...
- KVC该机制
KVC该机制 KVC是cocoa的大招,用来间接获取或者改动对象属性的方式. 一.KVC的作用: KVC大招之中的一个: [self setValuesForKeysWithDictionary:di ...
- VS2010程序打包操作
摘录:http://www.cnblogs.com/daban/archive/2012/06/27/2565449.html 1. 在vs2010 选择“新建项目”----“其他项目类型”-- ...
- 玩转html5(三)---智能表单(form),使排版更加方便
<!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/h ...
- HDU 1695 GCD 欧拉函数+容斥原理+质因数分解
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:在[a,b]中的x,在[c,d]中的y,求x与y的最大公约数为k的组合有多少.(a=1, a ...
- 客户端上显示csdn上的各类别下的的文章列表 (制作csdn app 三)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23597229 今天将在Android 使用Fragment,ViewPagerI ...
- 抓取csdn上的各类别的文章 (制作csdn app 二)
转载请表明出处:http://blog.csdn.net/lmj623565791/article/details/23532797 这篇博客接着上一篇(Android 使用Fragment,View ...
- CareerCup Chapter 4 Trees and Graphs
struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int val):val(val),left(NULL),rig ...