生活随笔
收集整理的這篇文章主要介紹了
hdu5745 La Vie en rose【dp+bitset优化】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- hdu5745 bitset+dp。bitset直接進行位運算時可以將復雜度降低到O(N/8)。用dp[i][j][k]代表s串第i個字符,p串第j個字符,k=0,1,2分別代表與前一個字符進行交換,不交換,與后一個字符進行交換。dp[i][j][1]=(s[i]=p[j])&(dp[i-1][j-1][0]|dp[i-1][j-1][1])考慮優化, 用bitset表示第一維,用滾動數組表示第二維。再用另外一個bitset預處理26個字符的情況,可以化解得到dp[cur][1]=w[p[j]-'a']&((dp[cur^1][0]|dp[cur^1][1])<<1),另外兩種情況可以同理處理。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include<bitset>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define pb push_back
using namespace std;
typedef vector<int> VI;
typedef long long ll;
const ll mod=
1000000007;
const int N=
1e5+
10;
char s[N],p[N];
bitset<N>dp[
2][
3];
bitset<N>w[
30];
int main()
{
int _,n,m,ok,cur;
scanf(
"%d",&_);
while(_--){
scanf(
"%d%d",&n,&m);
scanf(
"%s",s);
scanf(
"%s",p);
for(
int i=
0;i<
30;i++)w[i].reset();
for(
int i=
0;i<n;i++)w[s[i]-
'a'][i]=
1;
for(
int i=
0;i<
2;i++)
for(
int j=
0;j<
3;j++)dp[i][j].reset();cur=
1;dp[cur][
1]=w[p[
0]-
'a'];
if(m>
1) dp[cur][
2]=w[p[
1]-
'a'];
for(
int j=
1;j<m;j++){cur^=
1;dp[cur][
0]=w[p[j-
1]-
'a']&(dp[cur^
1][
2]<<
1);dp[cur][
1]=w[p[j]-
'a']&((dp[cur^
1][
0]|dp[cur^
1][
1])<<
1);
if(j+
1<m) dp[cur][
2]=w[p[j+
1]-
'a']&((dp[cur^
1][
0]|dp[cur^
1][
1])<<
1);}
for(
int i=
0;i<n;i++)
if(dp[cur][
0][i+m-
1]||dp[cur][
1][i+m-
1])
printf(
"1");
elseprintf(
"0");
printf(
"\n");}
return 0;
}
總結
以上是生活随笔為你收集整理的hdu5745 La Vie en rose【dp+bitset优化】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。