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("\n");for(int i=0;i<(N);i++)\ 20 {for(int j=0;j<(M);j++){\ 21 printf("%d",G[i][j]);}printf("\n");} 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 }