hdu4758 Walk Through Squares 自动机+DP
题意:给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的更多相关文章
- HDU4758 Walk Through Squares(AC自动机+状压DP)
题目大概说有个n×m的格子,有两种走法,每种走法都是一个包含D或R的序列,D表示向下走R表示向右走.问从左上角走到右下角的走法有多少种走法包含那两种走法. D要走n次,R要走m次,容易想到用AC自动机 ...
- hdu4758 Walk Through Squares (AC自己主动机+DP)
Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...
- hdu4758 Walk Through Squares
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=4758 题目: Walk Through Squares Time Limit: 4000/20 ...
- HDU4758 Walk Through Squares AC自动机&&dp
这道题当时做的时候觉得是数论题,包含两个01串什么的,但是算重复的时候又很蛋疼,赛后听说是字符串,然后就觉得很有可能.昨天队友问到这一题,在学了AC自动机之后就觉得简单了许多.那个时候不懂AC自动机, ...
- HDU3341 Lost's revenge(AC自动机&&dp)
一看到ACGT就会想起AC自动机上的dp,这种奇怪的联想可能是源于某道叫DNA什么的题的. 题意,给你很多个长度不大于10的小串,小串最多有50个,然后有一个长度<40的串,然后让你将这个这个长 ...
- 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 ...
- POJ1625 Censored!(AC自动机+DP)
题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...
- HDU2296 Ring(AC自动机+DP)
题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...
- HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
随机推荐
- Windows Phone开发(6):处理屏幕方向的改变
原文:Windows Phone开发(6):处理屏幕方向的改变 俺们都知道,智能手机可以通过旋转手机来改变屏幕的显示方向,更多的时候,对于屏幕方向的改变,我们要做出相应的处理,例如,当手机屏幕方向从纵 ...
- Java RMI(远程方法调用) 实例与分析 (转)
目的: 通过本文,可以加深对Java RMI的理解,知道它的工作原理,怎么使用等. 也为了加深我自己的理解,故整理成文.不足之处,还望指出. 概念解释: RMI(RemoteMethodInvocat ...
- Red Gate系列之四 SQL Data Compare 10.2.0.885 Edition 数据比较同步工具 完全破解+使用教程
原文:Red Gate系列之四 SQL Data Compare 10.2.0.885 Edition 数据比较同步工具 完全破解+使用教程 Red Gate系列之四 SQL Data Compare ...
- 重新想象 Windows 8 Store Apps (5) - 控件之集合控件: ComboBox, ListBox, FlipView, ItemsControl, ItemsPresenter
原文:重新想象 Windows 8 Store Apps (5) - 控件之集合控件: ComboBox, ListBox, FlipView, ItemsControl, ItemsPresente ...
- SQL server 表数据改变触发发送邮件
今天遇到一个问题,原有生产系统正在健康运行,现需要监控一张数据表,当增加数据的时候,给管理员发送邮件. 领到这个需求后,有同事提供方案:写触发器触发外部应用程序.这是个大胆的想法啊,从来没写过这样的触 ...
- [MSSQL]最小公约数
[摘要]一个朋友在展BOM的时候有这种需求,两列字段(数值):A ,B A=用量,B=底数,组成用量=用量/底数.A/B,若能被整除,显示整除的结果,若不能整除显示分数形式A/B(分数形式要是约分 ...
- Source Insight 3.X 插件支持utf8,完美解决中国乱码,连接到美丽的轮廓
上次SI多标签插件之后,由于公司内部编码改为utf8编码,因此特意做了这个Source Insight 3.X utf8插件. 下载地址:http://pan.baidu.com/s/1mgyZous ...
- Amazon SQS简单介绍 上篇
SQS即Simple Queue Service, 是一个分布式的消息队列服务,使用它很easy,消息队列服务能够用来buffer burst, 使整个服务异步处理,不要求组件始终可用. 开发者最初使 ...
- myeclipse如何恢复已删除的文件和代码
这是一篇文章分享秘诀:myeclipse恢复意外删除的文件和代码 [ 恢复误删文件 ] 今天在写代码的时候,不小心把一个包给删除了,然后这个包下全部的文件都没了,相信非常多人都有类似的经历. 幸好my ...
- Chrome 控制台不完全指南(转)
Chrome的开发者工具已经强大到没朋友的地步了,特别是其功能丰富界面友好的console,使用得当可以有如下功效: 更高「逼格」更快「开发调试」更强「进阶级的Frontender」 Bug无处遁形「 ...