/**
题目: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. jersey rest webservice

    参考官网:https://jersey.github.io/documentation/latest/getting-started.html#new-webapp 创建一个 JavaEE Web A ...

  2. [Functional Programming Monad] Combine Stateful Computations Using A State Monad

    The true power of the State ADT really shows when we start combining our discrete, stateful transact ...

  3. 什么是Cookie。Cookie的原理介绍,Cookie的简单应用

    1 介绍:Cookies亦称Cookie .Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术.Cookies是当你浏览某网站时,由Web服务 ...

  4. 做一个创建cocos2d-x新项目的shell脚本

    1. 进入console目录 cd /Users/apple/Documents/MyArchitecture/Cocos2d-x/Framework/cocos2d-x-3.4/tools/coco ...

  5. sublime HtmlPrettify

    用sublime都快一年多了,终于找到一款称心如意的format工具,可以同时格式化 html css js. HTML-CSS-JS Prettify 如果安装的时候出现问题,多调试调试,改改参数

  6. 常见的web前端性能优化

    一. 语义化HTML:语义化HTML的好处是可以使代码简洁清晰.支持不同设备.利于搜索引擎.便于团队开发: 减少DOM节点:加速页面渲染: 给图片加上正确的宽高值:这可以减少页面重绘,同时防止图片缩放 ...

  7. vue - static(.gitkeep)

    描述:git上传忽略的文件,与.gitnoignore一样.

  8. 安卓Eclipse开发人员的福音

    我们知道.谷歌已经放弃对Eclipse(ADT)的维护更新了.如今官网上也找不到ADT的下载链接了,我们大多数同学仍在使用的ADT版本号可能已经非常老了,预计大多数的SDK版本号仅仅到4.4,而,在尝 ...

  9. kvm 虚拟化 SMP(对称多处理器)介绍及配置

    一.SMP(对称多处理器)介绍 1)SMP简介 在计算机技术很普及和日益发达的今天,以 Intel.IBM 为代表的一些大公司推动着中央处理器(CPU)技术的飞速发展和更新换代.在如今计算机系统中,多 ...

  10. Zoho CEO:云计算泡沫巨大 Salesforce仅仅是新的Siebel

    最近Zoho CEO - Sridhar Vembu接受科技博客媒体Diginomica的专訪,从独特的眼光和见解.讲述了云计算行业环境.SaaS公司的生存状态.商业观念以及Zoho的商业模式. Sr ...