bitset的经典优化,即把可行性01数组的转移代价降低

bitset的适用情况,当内层状态只和外层状态的上一个状态相关,并且内层状态的相关距离是一个固定的数,可用bitset,换言之,能用滚动数组是能用bitset优化的前提

/*
dp[i,j][0|1|2]表示p串的第i位,s串的第j位相匹配,pi和pi-1换,pi不换,pi和pi+1换的状态下是否能匹配
dp[i,j][0] = dp[i-1,j-1][2] & p[i-1]==s[j]
dp[i,j][1] = (dp[i-1,j-1][1] || dp[i-1,j-1][2]) & p[i]==s[j]
dp[i,j][2] = (dp[i-1,j-1][0] || dp[i-1,j-1][1]) & p[i+1]==s[j] 由于dp是01数组,并且dp[i]的所有状态都由dp[i-1]得到,所以我们可以考虑用bitset优化j
观察原来的dp方程
dp[i][0]由dp[i-1][2]<<1 & p[i-1]和s[1..j] 得到
dp[i][1]由dp[i-1][1|2]<<1 & p[i]和s[1..j] 得到
dp[i][2]由dp[i-1][0|1]<<1 & p[i+1]和s[1..j] 得到
那么我们再预处理一下s数组和26个字符比较的bitset数组即可

*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define maxm 5005
bitset<maxn>dp[][];
bitset<maxn>f[];
int n,m;
char s[maxn],p[maxm]; void init(){//处理f数组
for(int i=;i<;i++)f[i].reset();
for(int j=;j<n;j++)f[s[j]-'a'][j]=;
} int main(){
int t;cin>>t;
while(t--){
scanf("%d%d",&n,&m);
scanf("%s%s",&s,&p);
init();
for(int i=;i<;i++)
for(int j=;j<;j++)
dp[i][j].reset();
//处理初始状态:即p[0]或p[1] 和s[1..j]的匹配
dp[][]=f[p[]-'a'];
if(m>) dp[][]=f[p[]-'a']; //然后刷表从p[1]转移到p[m] ,滚动数组节省空间
int cur=;
for(int i=;i<m;i++){
cur^=;
dp[cur][]=(dp[cur^][]<<) & f[p[i-]-'a'];//这里为什么要用<<1,因为是把dp[i-1][j-1]的答案用到dp[i][j]里,等于集体左移了一次
dp[cur][]=((dp[cur^][] | dp[cur^][])<<) & f[p[i]-'a'];
if(i<m-)
dp[cur][]=((dp[cur^][] | dp[cur^][])<<) & f[p[i+]-'a'];
} for(int i=;i<n;i++)
if(dp[cur][][i+m-] || dp[cur][][i+m-])cout<<;
else cout<<;
puts("");
}
}

字符串匹配dp+bitset,滚动数组优化——hdu5745(经典)的更多相关文章

  1. dp,滚动数组优化

    51Nod1084矩阵取数问题 V2 题意: 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上.第1遍时只能向下和向右走,第2遍时只能向上和向左 ...

  2. NOIP2008 传纸条(DP及滚动数组优化)

    传送门 这道题有好多好多种做法呀……先说一下最暴力的,O(n^4的做法) 我们相当于要找两条从左上到右下的路,使路上的数字和最大.所以其实路径从哪里开始走并不重要,我们就直接假设全部是从左上出发的好啦 ...

  3. HDU_1024.MaxSumPlusPlus(基础DP + 滚动数组优化讲解)

    这道题打破了我常规的做题思路,因为这是我刚开始训练DP,感觉这道题目好晕眼呀,emm其实就是感觉自己是真的菜...... 为什么说打破了我的做题思路呢,因为我平时看题解都是在已经AC或者完全不懂的情况 ...

  4. [BZOJ1044][HAOI2008]木棍分割 二分 + 单调队列优化dp + 滚动数组优化dp

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  5. LG3004 「USACO2010DEC」Treasure Chest 区间DP+滚动数组优化

    问题描述 LG3004 题解 把拿走的过程反向,看做添加的过程,于是很显然的区间DP模型. 设\(opt_{i,j}\)代表区间\([i,j]\)中Bessie可以获得的最大值,显然有 \[opt_{ ...

  6. CodeForces 173C Spiral Maximum 记忆化搜索 滚动数组优化

    Spiral Maximum 题目连接: http://codeforces.com/problemset/problem/173/C Description Let's consider a k × ...

  7. 51nod 编辑距离 + 滚动数组优化

    这道题一开始觉得增加和删除会移动字符串的位置很不好做 两个字符串dp状态一般是第一个前i个和第二个前j个 #include<cstdio> #include<algorithm> ...

  8. HDU - 1024 Max Sum Plus Plus 最大m段子段和+滚动数组优化

    给定n个数字,求其中m段的最大值(段与段之间不用连续,但是一段中要连续) 例如:2 5 1 -2 2 3 -1五个数字中选2个,选择1和2 3这两段. dp[i][j]从前j个数字中选择i段,然后根据 ...

  9. poj1159 dp(滚动数组优化)

    H - 简单dp 例题扩展 Crawling in process... Crawling failed Time Limit:3000MS     Memory Limit:65536KB     ...

随机推荐

  1. vue组件绑定原生事件

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 练习 |跟着Python达人

    [学习Python都是用来干嘛的?] 朱卫军 数据分析师 NEV行业 python那些事儿众号主 网址 https://www.zhihu.com/question/34098079/answer/8 ...

  3. 同源策略 - JSONP - CORS

    1.  Jquery 对象可以通过 .index() 进行取出自当前元素在父级元素中存放的索引: 2. 浏览器的同源策略 -- Ajax 在访问非本网站的时候,在数据返回的时候,会被浏览器拦截 - 后 ...

  4. 思维——cf1238C

    听思维的一道题,网上大多直接模拟,感觉有点麻烦,其实只要把连续段求出来,然后处理一下统计答案就行 两个注意点:1.除了第一个连续段,其余段长度都要+1 2.因为目的地是0,所以最后一段要特判一下 #i ...

  5. NOIp2018集训test-10-20 (bike day6)

    B 君的第一题 lanzhou $x^{\frac{p-1}{2}}\equiv 1(mod\ p)$ $x\equiv x*x^{\frac{p-1}{2}} (mod\ p)$ $x\equiv ...

  6. NX二次开发-Ufun API Example

    UF公共类型 UF_begin_timer计时函数 https://www.cnblogs.com/nxopen2018/p/10957135.html UF_end_timer计时函数 https: ...

  7. 带头节点的单链表-------C语言实现

    /***************************************************** Author:Simon_Kly Version:0.1 Date:20170520 De ...

  8. Dubbo入门到精通学习笔记(八):ActiveMQ的安装与使用(单节点)、Redis的安装与使用(单节点)、FastDFS分布式文件系统的安装与使用(单节点)

    文章目录 ActiveMQ的安装与使用(单节点) 安装(单节点) 使用 目录结构 edu-common-parent edu-demo-mqproducer edu-demo-mqconsumer 测 ...

  9. PE代码段中的数据

    PE代码段中可能包含一些数据,比如 optional header中的data directory会索引到一些数据,比如import/export table等等: 还有一些jump table/sw ...

  10. PAT_A1038#Recover the Smallest Number

    Source: PAT A1038 Recover the Smallest Number (30 分) Description: Given a collection of number segme ...