zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Python——查看安装位置和安装的库
    python——vs2017安装python库时,提示pip指令问题。
    数电——全减器分析(用74HC138设计提示)
    js $ 获取和设置 css样式中的属性值
    ajax 请求
    render 和 redirect 的区别
    django 之 session
    img 标签不显示图片的问题
    JavaScript jQuery bootstrap css ajax
    模板的继承
  • 原文地址:https://www.cnblogs.com/bin-gege/p/7259280.html
Copyright © 2011-2022 走看看