hdu 5745 La Vie en rose(dp+bitset)

题目链接: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=dpi1,j1,0 | dpi1,j1,1, (Ai==Bj) 
dpi,j,1=dpi1,j1,2, (Ai==Bj1) 
dpi,j,2=dpi1,j1,0 | dpi1,j1,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

 

转载于:https://www.cnblogs.com/bin-gege/p/7259280.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值