hdu-5745 La Vie en rose bitset
生活随笔
收集整理的這篇文章主要介紹了
hdu-5745 La Vie en rose bitset
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://acm.hdu.edu.cn/showproblem.php?pid=5745
第一次使用bitset這個東西,優點是可以常數優化,而此題優雅的bitset轉移剛好可以卡過
轉移方程是看的這篇博客,
http://blog.csdn.net/u012015746/article/details/51992281
“
首先得出一個?dp式子,dp[i][j][k]表示?A匹配到?i,B匹配到?j?
而?k表示?Bj的交換情況,0為不動,1與前面交換,2與后面交換?
轉移方程為:?
dpi,j,0=dpi?1,j?1,0?or?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?or?dpi?1,j?1,1,?(Ai==Bj+1)
“
此題數據改過,雖然博主的代碼現在提交是t的,但轉移方程很好理解
在轉移的時候稍微改改減少幾次位運算次數就可以了
#include<bits/stdc++.h> #define eps 1e-9 #define PI 3.141592653589793 #define bs 1000000007 #define bsize 256 #define MEM(a) memset(a,0,sizeof(a)) typedef long long ll; using namespace std; char s[100005],p[5005]; char ans[100005]; int n,m; bitset<100005>dp[2][3]; bitset<100005>v[26]; int main() {int T,i,j; // while(cin>>T)cin>>T;{while(T--){cin>>n>>m;scanf(" %s",s);scanf(" %s",p);for(i=0;i<26;i++)v[i].reset();for(i=0;i<n;i++){v[s[i]-'a'].set(n-i-1);}int now=1,pre=0;dp[0][0]=v[p[0]-'a'];dp[0][1].reset();if(m!=1)dp[0][2]=v[p[1]-'a'];for(i=1;i<m;i++){int i1=p[i]-'a';int i2=p[i-1]-'a';int i3=p[i+1]-'a';dp[now][0]=((dp[pre][0]|dp[pre][1])>>1)&v[i1];dp[now][1]=(dp[pre][2]>>1)&v[i2];if(i!=m-1)dp[now][2]=((dp[pre][0]|dp[pre][1])>>1)&v[i3];swap(now,pre);}for(i=0;i<n;i++){if(n-i-m>=0&&(dp[pre][0][n-i-m]|dp[pre][1][n-i-m]))ans[i]='1';elseans[i]='0';}ans[n]=0;printf("%s\n",ans);}}return 0;}
總結
以上是生活随笔為你收集整理的hdu-5745 La Vie en rose bitset的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 免费 PSD 下载: 20个精美的登录和
- 下一篇: 宇视10寸人脸门禁一体机全局接线图