标签:others 思路 rsa sequence chm contain necessary memset order
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=4758
题目:
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 1548 Accepted Submission(s): 514
1 #include <queue> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int mod = 1e9 + 7; 7 struct AC_auto 8 { 9 const static int LetterSize = 2; 10 const static int TrieSize = 2 * ( 4e2 + 1); 11 12 int tot,root,fail[TrieSize],end[TrieSize],next[TrieSize][LetterSize]; 13 int dp[2][TrieSize][101][4]; 14 15 int newnode(void) 16 { 17 memset(next[tot],-1,sizeof(next[tot])); 18 end[tot] = 0; 19 return tot++; 20 } 21 22 void init(void) 23 { 24 tot = 0; 25 root = newnode(); 26 } 27 28 int getidx(char x) 29 { 30 return x==‘R‘; 31 } 32 33 void insert(char *ss,int id) 34 { 35 int len = strlen(ss); 36 int now = root; 37 for(int i = 0; i < len; i++) 38 { 39 int idx = getidx(ss[i]); 40 if(next[now][idx] == -1) 41 next[now][idx] = newnode(); 42 now = next[now][idx]; 43 } 44 end[now]|=id; 45 } 46 47 void build(void) 48 { 49 queue<int>Q; 50 fail[root] = root; 51 for(int i = 0; i < LetterSize; i++) 52 if(next[root][i] == -1) 53 next[root][i] = root; 54 else 55 fail[next[root][i]] = root,Q.push(next[root][i]); 56 while(Q.size()) 57 { 58 int now = Q.front();Q.pop(); 59 for(int i = 0; i < LetterSize; i++) 60 if(next[now][i] == -1) next[now][i] = next[fail[now]][i]; 61 else 62 fail[next[now][i]] = next[fail[now]][i],Q.push(next[now][i]),end[next[now][i]]|=end[next[fail[now]][i]]; 63 } 64 } 65 66 int match(char *ss) 67 { 68 int len,now,res; 69 len = strlen(ss),now = root,res = 0; 70 for(int i = 0; i < len; i++) 71 { 72 int idx = getidx(ss[i]); 73 int tmp = now = next[now][idx]; 74 while(tmp) 75 { 76 res += end[tmp]; 77 end[tmp] = 0;//按题目修改 78 tmp = fail[tmp]; 79 } 80 } 81 return res; 82 } 83 84 void go(int n,int m) 85 { 86 //debug(); 87 int now=1; 88 memset(dp[0],0,sizeof dp[0]); 89 dp[0][0][0][0]=1; 90 for(int p=0;p<n+m;p++) 91 { 92 memset(dp[now],0,sizeof dp[now]); 93 for(int i=0;i<tot;i++) 94 for(int x=0;x<=n;x++) 95 for(int k=0;k<4&&x<=p&&p-x<=m;k++) 96 if(dp[now^1][i][x][k]) 97 { 98 if(x!=n) 99 { 100 int nt=next[i][0],st=end[nt]|k; 101 dp[now][nt][x+1][st] = (dp[now][nt][x+1][st] + dp[now^1][i][x][k] ) % mod; 102 } 103 if(p-x!=m) 104 { 105 int nt=next[i][1],st=end[nt]|k; 106 dp[now][nt][x][st] = (dp[now][nt][x][st] + dp[now^1][i][x][k] ) % mod; 107 } 108 } 109 // printf("=======\n"); 110 // for(int i=0;i<tot;i++) 111 // for(int x=0;x<=n&&x<=p+1&&p+1-x<=m;x++) 112 // for(int k=0;k<4;k++) 113 // printf("%d %d %d %d :%d\n",now,i,x,k,dp[now][i][x][k]); 114 now^=1; 115 } 116 int ans=0; 117 for(int i=0;i<tot;i++) 118 ans=(ans+dp[now^1][i][n][3])%mod; 119 printf("%d\n",ans); 120 } 121 void debug() 122 { 123 for(int i = 0;i < tot;i++) 124 { 125 printf("id = %3d,fail = %3d,end = %3d,chi = [",i,fail[i],end[i]); 126 for(int j = 0;j < LetterSize;j++) 127 printf("%3d",next[i][j]); 128 printf("]\n"); 129 } 130 } 131 }ac; 132 char ss[200]; 133 int main(void) 134 { 135 int t,n,m; 136 scanf("%d",&t); 137 while(t--) 138 { 139 scanf("%d%d%s",&m,&n,ss); 140 ac.init(); 141 ac.insert(ss,1); 142 scanf("%s",ss); 143 ac.insert(ss,2); 144 ac.build(); 145 ac.go(n,m); 146 } 147 return 0; 148 }
标签:others 思路 rsa sequence chm contain necessary memset order
原文地址:http://www.cnblogs.com/weeping/p/7623678.html