/**
题目: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. [Python爬虫] 之九:Selenium +phantomjs抓取活动行中会议活动(单线程抓取)

    思路是这样的,给一系列关键字:互联网电视:智能电视:数字:影音:家庭娱乐:节目:视听:版权:数据等.在活动行网站搜索页(http://www.huodongxing.com/search?city=% ...

  2. Springboot配置文件加载顺序

    使用Springboot开发的时候遇到了配置的问题,外部config里的配置文件本来没有配置https怎么启动还是https呢,原来开发中测试https在classpath路径的配置文件添加https ...

  3. Office 如何复印身份证正反面到一张纸上

    先把身份证任意一面放到打印机扫描的一侧(不要放到正中间)   正面扫描复印好之后,身份证翻面,还放在原来的位置   纸张拿出来之后,把已经有图案的放在上面,空白的留在下面,接着扫描   最后效果如下 ...

  4. PhoneGap录像 以及 录音功能 简单代码实现3

    1,录音功能 navigator.device.capture.captureAudio( function(files){//成功回调函数 Ext.getCmp("video_files_ ...

  5. java中异常介绍

    一.异常概述 异常处理已经成为衡量一门语言是否成熟的标准之一,目前的主流编程语言如C++.C#.Ruby.Python等,大都提供了异常处理机制.增加了异常处理机制后的程序有更好的容错性,更加健壮. ...

  6. ant-design getFieldDecorator 无法获取自定义组件的值

    1.自定义或第三方的表单控件,也可以与 Form 组件一起使用.只要该组件遵循以下的约定: (1)提供受控属性 value 或其它与 valuePropName 的值同名的属性. (2)提供 onCh ...

  7. webSQL 实现即时通讯

    websql存储方式一共有以下几个方法 openDatabase:这个方法使用现有的数据库或新建数据库来创建数据库对象. transaction:这个方法允许我们执行事务处理; executeSql: ...

  8. visio 画图工具

    1.线条 [设计] ---  [页面设置]----打开 对话框 [布局与排列]-----[排列]   ----  [样式] ---   [直 2.word中插入viso 插入→对象→visio

  9. 一个可变布局列表,有9种布局item大小,每个item可拖拽切换位置

    代码地址如下:http://www.demodashi.com/demo/11271.html 一.准备工作 准备一台安卓设备手机,4.4以上版本 本例子实现,一个可变布局列表,有9种布局item大小 ...

  10. 登录首页时报错:java.lang.IllegalArgumentException (不合法的参数异常)

    处理一个老项目,DOWN下项目并配好之后,启动没问题,但是登陆之后首页显示如下: 控制台报错如下: 严重: Servlet.service() for servlet jsp threw except ...