码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5745 La Vie en rose(dp+bitset)

时间:2017-07-30 17:11:26      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:target   sub   bit   class   its   log   opened   clu   img   

题目链接:hdu 5745 La Vie en rose

题意:

给两个字符串 a 和 b ,b可以进行变换,规则是可以任意交换相邻两个字符的位置,但是不可以有交叉(例如3和4交换,5和6交换 互不影响,但是2和3,3和4就不可以)。求a中每一个位置能不能匹配b或b变换得到的子串。

题解:

考虑dp,dp[i][j][k]表示a[i]和b[j]匹配,k为1表示j未做交换,k=0表示j和j-1进行交换,k=2表示j和j+1进行交换。

然后bitset优化一下常数。

dp方程为:

dpi,j,0=dpi?1,j?1,0 | dpi?1,j?1,1, (Ai==Bj) 
dpi,j,1=dpi?1,j?1,2, (Ai==Bj?1) 
dpi,j,2=dpi?1,j?1,0 | dpi?1,j?1,1, (Ai==Bj+1)

然后把i这一维压进bitset,j这一维滚动数组,然后发现j这一维可以原地dp,就又省去一个常数。

技术分享
 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=(a);i<=(b);++i)
 3 using namespace std;
 4 
 5 const int N=1e5+7;
 6 int t,n,m;
 7 char a[N],b[5007],ans[N];
 8 bitset<N>dp[3],num[26];
 9 
10 int main(){
11     scanf("%d",&t);
12     while(t--)
13     {
14         scanf("%d%d%s%s",&n,&m,a+1,b+1);
15         F(i,0,25)num[i].reset();
16         F(i,1,n)num[a[i]-a][i]=1;
17         F(i,0,2)dp[i].reset();
18         dp[0].set();
19         F(i,1,m)
20         {
21             int x=b[i]-a,y=b[i-1]-a,z=b[i+1]-a;
22             dp[0]=((dp[0]|dp[1])<<1);
23             if(i>1)dp[1]=(dp[2]<<1)&num[y];
24             if(i<m)dp[2]=dp[0]&num[z];
25             dp[0]&=num[x];
26         }
27         F(i,m,n)ans[i-m+1]=0+(dp[0][i]|dp[1][i]);
28         F(i,n-m+2,n)ans[i]=0;
29         ans[n+1]=0;puts(ans+1);
30     }
31     return 0;
32 }
View Code

 

hdu 5745 La Vie en rose(dp+bitset)

标签:target   sub   bit   class   its   log   opened   clu   img   

原文地址:http://www.cnblogs.com/bin-gege/p/7259280.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!