/**
题目:hdu5745 La Vie en rose
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5745
题意:题目给出的变换规则其实就是交换相邻元素, 并且每个元素最多交换一次.
思路:
那么一个O(nm)的dp其实十分显然, dp_{i,j,k}
​​ 表示匹配到s的第i个字符, p的第j个字符, j这一位的当前状态是k (0表示和前面交换, 1表示没有交换, 2表示和后面交换). 转移方程如下:
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]);
这个dp数组里面存的都是bool值, 可以考虑用bitset压缩这个dp数组中的第一维i, 然后滚动下第二维j, 就得到了O(N*M/W)的做法, 其中w是机器的字节长. */ /*
未用bitset优化前。
用一个滚动数组减少内存。
直接把枚举p串的那层循环放到第一层,然后滚动。 #include<iostream>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<algorithm>
#include<queue>
using namespace std;
typedef unsigned int ut;
typedef long long LL;
const int N = 1e5+1;
const int M = 5e3+1;
int dp[N][2][3];
char s[N], p[M];
int main()
{
int T;
int n, m;
cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
scanf("%s",s+1);
int ls = strlen(s+1);
scanf("%s",p+1);
int lp = strlen(p+1);
int d = 0;
for(int j = 1; j <= lp; j++){
for(int i = 1; i <= ls; i++){
if(j==1){
dp[i][d][0] = 0;
dp[i][d][1] = s[i]==p[j];
dp[i][d][2] = s[i]==p[j+1];
}else{
dp[i][d][0] = dp[i-1][d^1][2]&&(s[i]==p[j-1]);
dp[i][d][1] = (dp[i-1][d^1][0]||dp[i-1][d^1][1])&&(s[i]==p[j]);
dp[i][d][2] = (dp[i-1][d^1][0]||dp[i-1][d^1][1])&&(s[i]==p[j+1]);
}
}
d^=1;
}
for(int i = m; i <= ls; i++){
printf("%d",dp[i][d^1][0]||dp[i][d^1][1]);
}
for(int i = 1; i < m; i++){
printf("0");
}
printf("\n");
}
return 0;
} */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<bitset>
#include<algorithm>
#include<queue>
using namespace std;
typedef unsigned int ut;
typedef long long LL;
const int N = 1e5+;
const int M = 5e3+;
bitset<N> dp[][];
bitset<N> alp[];
char s[N], p[M];
int main()
{
int T;
int n, m;
cin>>T;
while(T--)
{
scanf("%d%d",&n,&m);
scanf("%s",s+);
int ls = strlen(s+);
scanf("%s",p+);
int lp = strlen(p+);
for(int i = ; i < ; i++) alp[i].reset();
for(int i = ; i < ; i++){
for(int j = ; j < ; j++){
dp[i][j].reset();
}
}
for(int i = ; i <= ls; i++){
alp[s[i]-'a'][i] = ;///alp[i][j]表示i+'a'这个字符在s字符串的j位置出现过。
}
dp[][] = alp[p[]-'a'];///dp[i][j][k]表示p字符串的位置i与s字符串的位置k,j=0表示i-1位置,j=1表示i位置,j=2表示i+1位置。
///所以dp[0][1]=alp[p[1]-'a'];和p字符串i位置相同的s字符串的k位置集合。
if(lp>=)
dp[][] = alp[p[]-'a'];
int d = ;
for(int j = ; j <= lp; j++){
dp[d][] = (dp[d^][]<<)&alp[p[j-]-'a'];
dp[d][] = ((dp[d^][]|dp[d^][])<<)&alp[p[j]-'a'];
if(j+<=lp)
dp[d][] = ((dp[d^][]|dp[d^][])<<)&alp[p[j+]-'a'];
d^=;
}
for(int i = m; i <= ls; i++){
printf("%d",dp[d^][][i]||dp[d^][][i]);
}
for(int i = ; i < m; i++){
printf("");
}
printf("\n");
}
return ;
}

hdu5745 La Vie en rose 巧妙地dp+bitset优化+滚动数组减少内存的更多相关文章

  1. HDU5745-La Vie en rose-字符串dp+bitset优化

    这题现场的数据出水了,暴力就能搞过. 标解是拿bitset做,转移的时候用bitset优化过的操作(与或非移位)来搞,复杂度O(N*M/w) w是字长 第一份标程的思路很清晰,然而后来会T. /*-- ...

  2. HDU 5745 La Vie en rose 暴力

    La Vie en rose 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5745 Description Professor Zhang woul ...

  3. HDU 5745 La Vie en rose

    La Vie en rose Time Limit: 14000/7000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  4. hdu 5745 La Vie en rose(2016多校第二场)

    La Vie en rose Time Limit: 14000/7000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  5. hdu 5745 La Vie en rose DP + bitset优化

    http://acm.hdu.edu.cn/showproblem.php?pid=5745 这题好劲爆啊.dp容易想,但是要bitset优化,就想不到了. 先放一个tle的dp.复杂度O(n * m ...

  6. 字符串匹配dp+bitset,滚动数组优化——hdu5745(经典)

    bitset的经典优化,即把可行性01数组的转移代价降低 bitset的适用情况,当内层状态只和外层状态的上一个状态相关,并且内层状态的相关距离是一个固定的数,可用bitset,换言之,能用滚动数组是 ...

  7. HDU 5745 La Vie en rose (DP||模拟) 2016杭电多校联合第二场

    题目:传送门. 这是一道阅读理解题,正解是DP,实际上模拟就能做.pij+1 指的是 (pij)+1不是 pi(j+1),判断能否交换输出即可. #include <iostream> # ...

  8. La Vie en rose (模拟)

    #include<bits/stdc++.h> using namespace std; ; ; int T, n, m; char str1[maxm], str2[maxn]; int ...

  9. hdu5745--La Vie en rose (DP+bitset)

    好题,学到新姿势! 题意:给两个字符串 a 和 b ,b可以进行变换,规则是可以任意交换相邻两个字符的位置,但是不可以有交叉(例如3和4交换,5和6交换 互不影响,但是2和3,3和4就不可以).求a中 ...

随机推荐

  1. 【Docker】mesos如何修改hostport默认端口范围?

    1.marathon文档:https://mesosphere.github.io/marathon/docs/native-docker.html Static port mapping: It's ...

  2. android APK反编译及代码混淆

    反编译.查看源代码,需要用到两个工具:dex2jar 和 jdgui dex2jar(google code) jdgui(google code),最新版本请见 官方 操作很简单,步骤如下: 1.将 ...

  3. 安卓新闻client笔记积累

    做一个项目,假设有第三方的框架的话.就会简单非常多.如今看的这个新闻client就用到了很多框架,还有非常多知识点,放在这里,记录下来. (1)Android Volley 之自己定义Request ...

  4. 适合移动手机使用的js环形菜单特效插件

    blooming-menu是一款适合在移动手机上使用的js环形菜单插件.该环形菜单提供了众多的參数,通过结合CSS3动画制作出效果很炫酷的圆形菜单展开和隐藏动画效果. 以下是这个圆形菜单菜价的可用參数 ...

  5. super.getclass()的结果是父类还是子类?

    package as; import java.util.Date; public class Test extends Date{ public static void main(String[] ...

  6. FEC

    什么是FEC http://zhidao.baidu.com/link?url=sbk7ue4n75HCbumrznBlAwdZAII8ZK2Xp3HTJ5BRkLJtDLFN3MGp9KOlrHVp ...

  7. Linux配置虚拟主机后,只能访问到主页怎么办?

    Linux配置虚拟主机后,只能访问到主页怎么办? 今天配置了lamp后,添加了一个虚拟主机,配置http.conf后,增加虚拟主机,测试访问发现只有域名下能访问,ljt.com但是域名下所有的都访问不 ...

  8. onethink 密码加密方式详解

    /** * 系统非常规MD5加密方法 * @param string $str 要加密的字符串 * @return string */ function think_ucenter_md5($str, ...

  9. lodash merge mergeWith使用

    1.作用 递归合并来源对象的自身和继承的可枚举属性到目标对象. 2.示例 <!DOCTYPE html> <html lang="zh"> <head ...

  10. 一个编译可执行jar包 jar包中不包含resources下config.properties且可以读到config.properties文件且classpath中有当前路径的pom

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...