标签:target sub bit class its log opened clu img
题意:
给两个字符串 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 }
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