hdu5745 La Vie en rose【dp+bitset优化】
来源:互联网 发布:java中的io流详解 编辑:程序博客网 时间:2024/05/16 14:36
- hdu5745 bitset+dp。bitset直接进行位运算时可以将复杂度降低到O(N/8)。用dp[i][j][k]代表s串第i个字符,p串第j个字符,k=0,1,2分别代表与前一个字符进行交换,不交换,与后一个字符进行交换。
dp[i][j][1]=(s[i]=p[j])&(dp[i-1][j-1][0]|dp[i-1][j-1][1])
考虑优化, 用bitset表示第一维,用滚动数组表示第二维。再用另外一个bitset预处理26个字符的情况,可以化解得到dp[cur][1]=w[p[j]-'a']&((dp[cur^1][0]|dp[cur^1][1])<<1)
,另外两种情况可以同理处理。
/* ***********************************************Author :MaltubEmail :xiang578@foxmail.comBlog :htttp://www.xiang578.com************************************************ */#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>#include<bitset>//#include <bits/stdc++.h>#define rep(i,a,n) for(int i=a;i<n;i++)#define per(i,a,n) for(int i=n-1;i>=a;i--)#define pb push_backusing namespace std;typedef vector<int> VI;typedef long long ll;const ll mod=1000000007;const int N=1e5+10;char s[N],p[N];bitset<N>dp[2][3];bitset<N>w[30];int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int _,n,m,ok,cur; scanf("%d",&_); while(_--) { scanf("%d%d",&n,&m); scanf("%s",s); scanf("%s",p); for(int i=0;i<30;i++) w[i].reset(); for(int i=0;i<n;i++) w[s[i]-'a'][i]=1; for(int i=0;i<2;i++) for(int j=0;j<3;j++) dp[i][j].reset(); cur=1; dp[cur][1]=w[p[0]-'a']; if(m>1) dp[cur][2]=w[p[1]-'a']; for(int j=1;j<m;j++) { cur^=1; dp[cur][0]=w[p[j-1]-'a']&(dp[cur^1][2]<<1); dp[cur][1]=w[p[j]-'a']&((dp[cur^1][0]|dp[cur^1][1])<<1); if(j+1<m) dp[cur][2]=w[p[j+1]-'a']&((dp[cur^1][0]|dp[cur^1][1])<<1); } for(int i=0;i<n;i++) if(dp[cur][0][i+m-1]||dp[cur][1][i+m-1]) printf("1"); else printf("0"); printf("\n"); } return 0;}/*#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>//#include <bits/stdc++.h>#define rep(i,a,n) for(int i=a;i<n;i++)#define per(i,a,n) for(int i=n-1;i>=a;i--)#define pb push_backusing namespace std;typedef vector<int> VI;typedef long long ll;const ll mod=1000000007;const int N=1e5+10;char s[N],p[N];int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int _,n,m,ok; scanf("%d",&_); while(_--) { scanf("%d%d",&n,&m); scanf("%s",s); scanf("%s",p); for(int i=0;i<=n-m;i++) { ok=1; for(int j=0;j<m;j++) { if(s[i+j]==p[j]) continue; if(j+1<m&&s[i+j]==p[j+1]&&s[i+j+1]==p[j]) {j++;continue;} ok=0; break; } printf("%d",ok); } for(int i=n-m+1;i<n;i++) printf("0"); printf("\n"); } return 0;}*/
0 0
- hdu5745 La Vie en rose dp+bitset优化
- hdu5745 La Vie en rose【dp+bitset优化】
- HDU5745 La Vie en rose
- HDU5745 La Vie en rose
- HDU 5745 La Vie en rose(DP+bitset优化)
- hdu 5745 La Vie en rose(dp + bitset优化)
- HDU 5745 La Vie en rose bitset优化dp
- HDOJ 5745 La Vie en rose (bitset优化DP)
- hdu 5745 La Vie en rose(bitset优化dp)
- HDU 5745 La Vie en rose(bitset优化dp)
- hdu5745 La Vie en rose(暴力)
- hdu5745-La Vie en rose代码
- hdu5745 La Vie en rose (字符串)
- HDU5745(2016多校第二场)——La Vie en rose(bitset,动态规划)
- [HDU 5745] La Vie en rose (DP+bitset卡时)
- HDOJ 5745 La Vie en rose DP+bitset
- hdu-5745 La Vie en rose bitset
- dp+bitset优化______La Vie en rose( hdu 5745 2016多校第二场)
- Mysql初始化root密码和允许远程访问
- poj 3087 Shuffle'm Up
- unix哲学
- ListView的用法
- 路由条目说明
- hdu5745 La Vie en rose【dp+bitset优化】
- React/React Native 的ES5 ES6写法对照表
- 网易 星际穿越
- STL容器vector使用
- 第1章 Windows程序内部运行机制
- Android如何实现获取短信验证码的功能
- Exynos4412 Uboot 移植(三)—— Uboot添加自定义命令
- 使用FCN做图像语义分割(实践篇)
- hive去除指定重复的数据举例