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 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 ?

 

Input

  The first line contains a number T,(T is about 100, including 90 small test cases and 10 large ones) denoting the number of the test cases.


  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.

 

Output

  For each test cases,print the answer MOD 1000000007 in one line.

 

Sample Input

2
3 2
RRD
DDR
3 2
R
D
 

Sample Output

1
10

题意:给你两串,求用m个R。n个D能组成多少个包括这两个串

思路:先构造一个AC自己主动机记录每一个状态包括两个串的状态,然后利用dp[i][j][k][s]表示i个R,j个D。此时AC自己主动机状态位置到k的时候,状态为s时的个数进行转移

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
const int mod = 1e9+7; int dp[110][110][220][4];
int n,m;
int nxt[420][2],fail[420],end[420];
int root,cnt; inline int change(char ch) {
if (ch == 'R')
return 0;
else return 1;
} inline int newNode() {
for (int i = 0; i < 2; i++)
nxt[cnt][i] = -1;
end[cnt++] = 0;
return cnt-1;
} inline void init() {
cnt = 0;
root = newNode();
} inline void insert(char buf[], int id) {
int len = strlen(buf);
int now = root;
for (int i = 0; i < len; i++) {
if (nxt[now][change(buf[i])] == -1)
nxt[now][change(buf[i])] = newNode();
now = nxt[now][change(buf[i])];
}
end[now] |= (1<<id);
} inline void build() {
queue<int> q;
fail[root] = root;
for (int i = 0; i < 2; i++)
if (nxt[root][i] == -1)
nxt[root][i] = root;
else {
fail[nxt[root][i]] = root;
q.push(nxt[root][i]);
} while (!q.empty()) {
int now = q.front();
q.pop();
end[now] |= end[fail[now]];
for (int i = 0; i < 2; i++)
if (nxt[now][i] == -1)
nxt[now][i] = nxt[fail[now]][i];
else {
fail[nxt[now][i]] = nxt[fail[now]][i];
q.push(nxt[now][i]);
}
}
} inline int solve() {
dp[0][0][0][0] = 1;
for (int x = 0; x <= n; x++)
for (int y = 0; y <= m; y++)
for (int i = 0; i < cnt; i++)
for (int k = 0; k < 4; k++) {
if (dp[x][y][i][k] == 0)
continue;
if (x < n) {
int cur = nxt[i][0];
dp[x+1][y][cur][k|end[cur]] += dp[x][y][i][k];
dp[x+1][y][cur][k|end[cur]] %= mod;;
}
if (y < m) {
int cur = nxt[i][1];
dp[x][y+1][cur][k|end[cur]] += dp[x][y][i][k];
dp[x][y+1][cur][k|end[cur]] %= mod;
}
}
int ans = 0;
for (int i = 0; i < cnt; i++) {
ans += dp[n][m][i][3];
ans %= mod;
}
return ans;
} char str[210]; int main() {
int t;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &m);
init();
for (int i = 0; i < 2; i++) {
scanf("%s", str);
insert(str, i);
} build();
for (int i = 0; i <= n; i++)
for (int j = 0; j <= m; j++)
for (int x = 0; x < cnt; x++)
for (int y = 0; y < 4; y++)
dp[i][j][x][y] = 0; printf("%d\n", solve());
}
return 0;
}

HDU - 4758 Walk Through Squares (AC自己主动机+DP)的更多相关文章

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

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

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

    题意:给你两个串A,B, 问一个串长为M+N且包含A和B且恰好包含M个R的字符串有多少种组合方式,所有字符串中均只含有字符L和R. dp[i][j][k][S]表示串长为i,有j个R,在自动机中的状态 ...

  3. HDU 4758 Walk Through Squares ( Trie图 && 状压DP && 数量限制类型 )

    题意 : 给出一个 n 行.m 列的方格图,现从图左上角(0, 0) 到右下角的 (n, m)走出一个字符串(规定只能往下或者往右走),向右走代表' R ' 向下走则是代表 ' D ' 最后从左上角到 ...

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

    题目链接 难得出一个AC自动机,我还没做到这个题呢...这题思路不难想,小小的状压出一维来,不过,D和R,让我wa死了,AC自动机,还得刷啊... #include<iostream> # ...

  5. HDU - 2825 Wireless Password(AC自己主动机+DP)

    Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...

  6. Hdu 3341 Lost&#39;s revenge (ac+自己主动机dp+hash)

    标题效果: 举个很多种DNA弦,每个字符串值值至1.最后,一个长字符串.要安排你最后一次另一个字符串,使其没事子值和最大. IDEAS: 首先easy我们的想法是想搜索的!管她3721..直接一个字符 ...

  7. 【HDU 5384】Danganronpa(AC自己主动机)

    看官方题解貌似就是个自己主动机裸题 比赛的时候用kuangbin的AC自己主动机模板瞎搞的,居然A了,并且跑的还不慢.. 存下模板吧 #include<cstdio> #include&l ...

  8. HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)

    题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP ...

  9. HDU 2222 Keywords Search(AC自己主动机模板题)

    题意:给出一个字符串和若干个模板,求出在文本串中出现的模板个数. 思路:由于有可能有反复的模板,trie树权值记录每一个模板出现的次数就可以. #include<cstdio> #incl ...

随机推荐

  1. c++ 设计模式之简单的工厂模式

    调试环境:vs2010 // test0.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> ...

  2. [Tailwind] Extending Tailwind with Responsive Custom Utility Classes

    You are able to extend the custom css with hover, focus, group-hover, responsive variants class in t ...

  3. 【简单的案例分享,停机10分钟】10204升级CRS&amp;DB的PSU至102044

    发现一个现象,AIX5.3+HACMP+10.2.0.4RAC+RAW的环境,执行五六年的数据库crsd.log都会报下面错误: ----------------------------------- ...

  4. Uva 12012 Detection of Extraterrestrial 求循环节个数为1-n的最长子串长度 KMP

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=3163">点击打开链接 题意: ...

  5. 英语发音规则---B字母

    英语发音规则---B字母 一.总结 一句话总结: 1.B发[b]音? bike [baɪk] n. 自行车 bus [bʌs] n. 公共汽车 bag [bæg] n. 袋:猎获物 baby ['be ...

  6. DB-MySQL:MySQL 临时表

    ylbtech-DB-MySQL:MySQL 临时表 1.返回顶部 1. MySQL 临时表 MySQL 临时表在我们需要保存一些临时数据时是非常有用的.临时表只在当前连接可见,当关闭连接时,Mysq ...

  7. HIT Software Construction Lab 5_经验总结

    前言: 终于写完lab5了,这次lab5是基于lab3的一次实验,主要是王忠杰老师提供了4个大约有50w行的大文件让我们根据自己所选应用读取其中两个并且创建轨道系统. 这次lab5优化的我很崩溃,因为 ...

  8. 【转】Docker基础

    一.简介 Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的CGroup.Namespace.Union FS等技术实现的一种系统级虚拟化技术. 特性 更高效的利用系统资源: ...

  9. CaffeNet用于Flickr Style数据集上的风格识别

    转自 http://blog.csdn.net/liumaolincycle/article/details/48501423 微调是基于已经学习好的模型的,通过修改结构,从已学习好的模型权重中继续训 ...

  10. Fine-tuning CaffeNet for Style Recognition on “Flickr Style” Data 数据下载遇到的问题

    (下载的时候没有提示 不知道是正在下 还是出现错误 卡着了)..一直没有反应 下载前要以管理员身份运行 sudo su 再 python examples/finetune_flickr_style/ ...