hdu4758Walk Through Squares(ac自动机+dp)
dp[x][y][node][sta] 表示走到在x,y位置node节点时状态为sta的方法数,因为只有2个病毒串,这时候的状态只有4种,根据可走的方向转移一下。
这题输入的是m、N,先列后行,因为输反了,WA了N次啊。。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 210
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
const int child_num = ;
const int mod = ;
int n,m;
int dis[][] = {,,,};
char vir[];
class AC
{
private:
int ch[N][child_num];
int fail[N];
int val[N];
int Q[N];
int id[];
int dp[N][][][];
int sz;
public:
void init()
{
fail[] = ;
id['R'] = ;
id['D'] = ;
}
void reset()
{
memset(val,,sizeof(val));
memset(ch[],,sizeof(ch[]));
sz = ;
}
void insert(char *a,int key)
{
int p = ;
for( ; *a ; a++)
{
int d = id[*a];
if(ch[p][d]==)
{
memset(ch[sz],,sizeof(ch[sz]));
ch[p][d] = sz++;
}
p = ch[p][d];
}
val[p] = (<<(key-));
}
void construct()
{
int i,head = ,tail = ;
for(i = ; i < child_num; i++)
{
if(ch[][i])
{
fail[ch[][i]] = ;
Q[tail++] = ch[][i];
}
}
while(tail!=head)
{
int u = Q[head++];
val[u]|=val[fail[u]];
for(i = ; i < child_num ; i++)
{
if(ch[u][i])
{
fail[ch[u][i]] = ch[fail[u]][i];
Q[tail++] = ch[u][i];
}
else ch[u][i] = ch[fail[u]][i];
}
}
}
void work()
{
int i,j,g;
for(i = ;i <= sz ;i++)
for(j = ; j <= n+ ;j++)
for(g = ; g <= m+; g++)
for(int e = ; e < ; e++)
dp[i][j][g][e] = ;
//memset(dp,0,sizeof(dp)); dp[][][][] = ;
for(j = ; j <= n ;j ++)
for(g = ; g <= m ; g++)
{
for(i = ;i < sz ; i++)
for(int o = ; o < ; o++)
for(int e = ;e < child_num ;e++)
{
int tx = dis[e][]+j;
int ty = dis[e][]+g;
int p = ch[i][e];
int pp = val[ch[i][e]];
dp[p][tx][ty][o|pp] = (dp[p][tx][ty][o|pp]+dp[i][j][g][o])%mod;
}
}
int ans = ;
for(i = ;i < sz ;i++)
ans = (ans+dp[i][n][m][])%mod;
printf("%d\n",ans%mod);
}
}ac;
int main()
{
int t;
cin>>t;
ac.init();
while(t--)
{
ac.reset();
scanf("%d%d",&n,&m);
n++,m++;
scanf("%s",vir);
ac.insert(vir,);
scanf("%s",vir);
ac.insert(vir,);
ac.construct();
ac.work();
}
return ;
}
hdu4758Walk Through Squares(ac自动机+dp)的更多相关文章
- HDU 4758 Walk Through Squares(AC自动机+DP)
题目链接 难得出一个AC自动机,我还没做到这个题呢...这题思路不难想,小小的状压出一维来,不过,D和R,让我wa死了,AC自动机,还得刷啊... #include<iostream> # ...
- HDU4758 Walk Through Squares AC自动机&&dp
这道题当时做的时候觉得是数论题,包含两个01串什么的,但是算重复的时候又很蛋疼,赛后听说是字符串,然后就觉得很有可能.昨天队友问到这一题,在学了AC自动机之后就觉得简单了许多.那个时候不懂AC自动机, ...
- 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步) ...
- hdu 4117 GRE Words AC自动机DP
题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...
- hdu 2457(ac自动机+dp)
题意:容易理解... 分析:这是一道比较简单的ac自动机+dp的题了,直接上代码. 代码实现: #include<stdio.h> #include<string.h> #in ...
- HDU 2425 DNA repair (AC自动机+DP)
DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- [转]MongoDB密码设置(基于windows)
参考文档:http://www.cnblogs.com/zengen/archive/2011/04/23/2025722.html MongoDB部署到Windows上后是默认是无权限限制的的. ...
- [knowledge][basic][hardware] 内存的硬件结构(转)
写的并不太易懂,但概念性的科普已足够. 原文地址:http://blog.csdn.net/miaomao1989/article/details/51508195 Memory中的Channel/R ...
- Day2(2016/1/22)——Testing
Activity Button,Toast,Finish 显式intent 隐式明天再看…… 感觉要先补一补java……
- HDFS的概念
1.数据块 每个磁盘都有默认的数据块大小,这是磁盘进行数据读/写的最小单位.构建于单个磁盘之上的文件系统通过磁盘块来管理该文件系统中的块,该文件系统块的大小可以是磁盘块的整数倍.文件系统快一半为几千字 ...
- 《Linux内核分析》第六周 进程的描述与创建
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK SIX(3 ...
- Extjs 图片的自动缩放
function resizeImage(obj) { var width = Ext.getCmp('welcome').getWidth(); //welcome 为一Panel的id 分割线下的 ...
- 去掉comments
三种comments: /* Test program */ int main() { // variable declaration int a, b, c; /* This is a test m ...
- php判断闰年
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- pod install出现[!] /bin/bash -c错误,Installing Realm报错
pod install出现错误,具体错误信息如下: Installing Realm () [!] /bin/bash -c set -e sh build.sh cocoapods-setup co ...
- chrome浏览器不允许记忆登录账户的方法
autocomplete方法 https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_ ...