您的位置:首页 > 其它

hdu4758Walk Through Squares(ac自动机+dp)

2014-05-25 09:53 148 查看
链接

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-8;
const double pi = acos(-1.0);
const double inf = ~0u>>2;
const int child_num = 2;
const int mod = 1000000007;
int n,m;
int dis[2][2] = {1,0,0,1};
char vir[150];
class AC
{
private:
int ch
[child_num];
int fail
;
int val
;
int Q
;
int id[128];
int dp
[110][110][4];
int sz;
public:
void init()
{
fail[0] = 0;
id['R'] = 0;
id['D'] = 1;
}
void reset()
{
memset(val,0,sizeof(val));
memset(ch[0],0,sizeof(ch[0]));
sz = 1;
}
void insert(char *a,int key)
{
int p =0 ;
for( ; *a ; a++)
{
int d = id[*a];
if(ch[p][d]==0)
{
memset(ch[sz],0,sizeof(ch[sz]));
ch[p][d] = sz++;
}
p = ch[p][d];
}
val[p] = (1<<(key-1));
}
void construct()
{
int i,head = 0,tail = 0;
for(i = 0 ;  i < child_num;  i++)
{
if(ch[0][i])
{
fail[ch[0][i]] = 0;
Q[tail++] = ch[0][i];
}
}
while(tail!=head)
{
int u = Q[head++];
val[u]|=val[fail[u]];
for(i = 0; 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 = 0;i <= sz ;i++)
for(j = 1; j <= n+1 ;j++)
for(g = 1; g <= m+1; g++)
for(int e =0 ; e  < 4 ; e++)
dp[i][j][g][e] = 0;
//memset(dp,0,sizeof(dp));

dp[0][1][1][0] = 1;
for(j = 1; j <= n ;j ++)
for(g = 1; g <= m ; g++)
{
for(i = 0 ;i < sz ; i++)
for(int o = 0; o < 4 ; o++)
for(int e = 0 ;e < child_num ;e++)
{
int tx = dis[e][0]+j;
int ty = dis[e][1]+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 = 0;
for(i = 0 ;i < sz ;i++)
ans = (ans+dp[i]
[m][3])%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,1);
scanf("%s",vir);
ac.insert(vir,2);
ac.construct();
ac.work();
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: