HDU5745-La Vie en rose-字符串dp+bitset优化

这题现场的数据出水了,暴力就能搞过。

标解是拿bitset做,转移的时候用bitset优化过的操作(与或非移位)来搞,复杂度O(N*M/w) w是字长

第一份标程的思路很清晰,然而后来会T。

 1 /*--------------------------------------------------------------------------------------*/
 2 
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <cstring>
 6 #include <ctype.h>
 7 #include <cstdlib>
 8 #include <cstdio>
 9 #include <vector>
10 #include <string>
11 #include <bitset>
12 #include <queue>
13 #include <stack>
14 #include <cmath>
15 #include <set>
16 #include <map>
17 
18 //debug function for a N*M array
19 #define debug_map(N,M,G) printf("
");for(int i=0;i<(N);i++)
20 {for(int j=0;j<(M);j++){
21 printf("%d",G[i][j]);}printf("
");}
22 //debug function for int,float,double,etc.
23 #define debug_var(X) cout<<#X"="<<X<<endl;
24 #define LL long long
25 /*--------------------------------------------------------------------------------------*/
26 using namespace std;
27 
28 int N,M,T;
29 const int maxn = 1e5+10;
30 const int maxm = 5000+10;
31 
32 bitset <maxn> dp[3],D[26];
33 char s[maxn],p[maxm];
34 
35 void solve()
36 {
37     for(int i=0;i<26;i++) D[i].reset();
38     for(int i=0;i<N;i++)  D[s[i]-'a'][i] = 1;
39 
40     dp[0].reset();
41     dp[1].reset();
42     dp[2].reset();
43     for(int i=0;i<N;i++) dp[0][i] = 1;
44 
45     for(int i=0;i<M;i++)
46     {
47         int cur = p[i]-'a';
48         dp[(i+1)%3] = dp[i%3] & D[cur]>>i;
49         if(i > 0)
50         {
51             int lst = p[i-1]-'a';
52             dp[(i+1)%3] |= dp[(i+2)%3] & D[cur]>>i-1 & D[lst]>>i;
53         }
54     }
55 
56     for(int i=0;i<N;i++)
57     {
58         if(dp[M % 3][i] == 1) putchar('1');
59         else putchar('0');
60     }
61     puts("");
62 }
63 
64 int main()
65 {
66     //freopen("1012.in","r",stdin);
67     //freopen("1012.bitset.out","w",stdout);
68     scanf("%d",&T);
69     while(T--)
70     {
71         scanf("%d%d ",&N,&M);
72         scanf("%s%s",s,p);
73         solve();
74     }
75 }
原文地址:https://www.cnblogs.com/helica/p/5750758.html