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次啊。。
View Code
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
相关文章推荐
- UVA 1399 - Puzzle(AC自动机+DP)
- ZOJ3494 BCD Code-AC自动机+数位DP
- poj 1625 AC自动机上的DP
- hdu DNA repair(AC自动机+DP)
- ZOJ3494 BCD Code (AC自动机+数位DP)
- AC自动机+DP(总结)+hdu2457
- HDU2296(AC自动机+DP)
- HDU3341 Lost's revenge(AC自动机&&dp)
- HDU 4511 (AC自动机+状态压缩DP)
- hdu 2825 AC自动机+状压dp
- HDU 6086 Rikka with String (AC 自动机+状压 dp, 2017 Multi-Univ Training Contest 5)
- hdu3341Lost's revenge (AC自动机+变进制dp)
- HDU 4758 Walk Through Squares(AC自动机+DP)
- 【HDU3341】AC自动机状态压缩DP,或者说hash枚举DP,-------出题人卡常数都是狗!!!!!
- HOJ 13108 Just Another Knapsack Problem (AC自动机+dp)
- poj3691(ac自动机+dp)
- hdu 3341(ac自动机+dp)
- 【bzoj3530】【sdoi2014】【数数】【AC自动机+数位dp】
- 【HDU2825】Wireless Password (AC自动机+状压DP)
- [2018雅礼集训1-4]字符串 AC自动机+状压DP