zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    离线缓存之RNCachingURLProtocol解析
    Element demo解析
    GHUnit+OCMock
    XCTest+XCTool
    day1`4整理
    day4 笔记
    day3
    day1
    day2
    Python学习(二)——Python基础
  • 原文地址:https://www.cnblogs.com/helica/p/5750758.html
Copyright © 2011-2022 走看看