链接

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 ;
}

最新文章

  1. atexit函数
  2. 淘宝(阿里百川)手机客户端开发日记第十三篇 mysql的连接
  3. mysql中表名是order的CRUD的错误
  4. sqlserver 常用语句
  5. 8. Add the dashboard
  6. 使用ngrok
  7. ExtJs4学习MVC中的Store
  8. [转]iOS设备唯一标识探讨
  9. 世纪大争论:Linux还是GNU/Linux?
  10. double类型之四舍五入
  11. Apache多端口配置
  12. testNG实现test失败后重复执行,
  13. react 开发知识准备
  14. 【模板小程序】求小于等于N范围内的质数
  15. linux中的find命令常用场景
  16. 网络编程-Mysql-2、各种查询
  17. Java 获取class method parameter name
  18. pyspider示例代码:解析JSON数据
  19. Python isspace() 方法检测字符串是否只由空格组成。
  20. http解析过程

热门文章

  1. 没有对“C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files”的写访问权限 的解决方案
  2. Synergy 鼠标和键盘共享软件
  3. mvc3升级mvc4的方法记录.
  4. 使用NSURLSession
  5. js 中escape,encodeURI,encodeURIComponent的区别
  6. NSArray倒序
  7. Pycharm 2016 2 激活
  8. redis集群配置
  9. emoji探寻之路
  10. 关注微信 即可连上wifi 的设计思路