hdu5745La Vie en rose
生活随笔
收集整理的這篇文章主要介紹了
hdu5745La Vie en rose
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5745
題意:給定一個母串s和一個子串p。問s中有多少個位置可以匹配p,可以不完全匹配,p字符串中的每個位置的字符最多可以變動一次(不變的,與前面的字符交換,與后面的字符交換)。
分析:做多校學姿勢。xg的題解解釋得很好,但是對于我這種沒寫過這種優化的人來說還是要看代碼學習一遍,我說下我的理解吧。首先xg列出了dp方程:dp[i][j][0]=dp[i-1][j-1][2]&&s[i]==p[j-1]、dp[i][j][1]=(dp[i-1][j-1][0]||dp[i-1][j-1][1])&&s[i]==p[j]、dp[i][j][2]=(dp[i-1][j-1][0]||dp[i-1][j-1][1])&&s[i]==p[j+1]。我們先遍歷p的1~m個字符然后用bitset來表示有遍歷到當前p[i]時上一層有哪些位置的i是匹配到了前i-1個字符,然后根據當前字符是誰直接去找哪些位置是合法的來更新當前層。這樣的話我們就能一層一層的得到1~n的哪些位置是合法的。重點是預處理出26個字符在哪些位置出現過然后用bitset存下來以便能直接&出當前層哪些位置是合法的,還不懂的話看看代碼吧。O(n*m/w)。PS:XG增強了數據,減小了時間,變成了3.5s。我的程序過不了了。想過的人自己手寫bitset卡卡常數吧。
代碼:
#include<map> #include<set> #include<cmath> #include<queue> #include<bitset> #include<math.h> #include<vector> #include<string> #include<stdio.h> #include<cstring> #include<iostream> #include<algorithm> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; const int N=100010; const int mod=100000000; const int MOD1=1000000007; const int MOD2=1000000009; const double EPS=0.00000001; typedef long long ll; const ll MOD=1000000007; const int MAX=2000000010; const ll INF=1ll<<55; const double pi=acos(-1.0); typedef double db; typedef unsigned long long ull; char s[N],p[5010]; bitset<N>w[30]; bitset<N>dp[2][3]; int main() {int i,j,n,m,t,now,las;scanf("%d", &t);while (t--) {scanf("%d%d", &n, &m);scanf("%s%s", s+1, p+1);for (i=0;i<26;i++) w[i].reset();for (i=1;i<=n;i++) w[s[i]-'a'][i-1]=1;now=las=1;dp[now][1].set();dp[now][0].reset();dp[now][2].reset();for (i=1;i<=m;i++) {las=now;now^=1;for (j=0;j<3;j++) dp[now][j].reset();int pre=p[i-1]-'a',mid=p[i]-'a',suf=p[i+1]-'a';if (i>1) dp[now][0]=(dp[las][2]&w[pre])<<1;dp[now][1]=((dp[las][0]&w[mid])|(dp[las][1]&w[mid]))<<1;if (i<m) dp[now][2]=((dp[las][0]&w[suf])|(dp[las][1]&w[suf]))<<1;}for (i=m;i<=n;i++)if (dp[now][0][i]||dp[now][1][i]) printf("1");else printf("0");for (i=n+1;i<=n+m-1;i++) printf("0");printf("\n");}return 0; }總結
以上是生活随笔為你收集整理的hdu5745La Vie en rose的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用GDI+实现gif图像背景透明
- 下一篇: UMAP分析及可视化