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("");
}
}

最新文章

  1. 自己封装的一个原生JS拖动方法。
  2. VLC嵌入网页,终于要成功了!
  3. 新塘ARM平台交叉编译minigui界面库
  4. PowerDeigner 一个很好的画uml 和建模的软件
  5. 通过PowerShell获取TCP响应(类Telnet)
  6. 慢牛股票-基于Sencha+Cordova的股票类APP
  7. poj 1556 (Dijkstra + Geometry 线段相交)
  8. [MySQL] 字符集的选择
  9. Dice chrone execise
  10. PHP前端$.ajax传递数据到后台
  11. 2016 系统设计第一期 (档案一)MVC 控制器接收表单数据
  12. 桌面环境与桌面搜索Desktop Search tools
  13. ok6410驱动usb摄像头
  14. 好玩的获取目录信息的例子[C#]
  15. 有关HTTP的粗读
  16. stanford-parser for C#
  17. 【转】MVC HtmlHelper用法大全
  18. java操作Jacoco合并dump文件
  19. left outer join的on不起作用
  20. Flex中如何利用FocusManager类的setFocus函数设置TextInput的焦点的例子

热门文章

  1. new和delete,p150
  2. 服务注册与发现---spring cloud
  3. HIVE的Shell操作
  4. 深入理解Magento - 第一章 - Magento强大的配置系统
  5. PHP FILTER_SANITIZE_URL 过滤器
  6. RichViewEdit
  7. [Luogu P4178]Tree 题解(点分治+平衡树)
  8. (转)Linux C 多线程编程----互斥锁与条件变量
  9. thinkphp5.0多条件模糊查询以及多条件查询带分页如何保留参数
  10. HDU 5119 Happy Matt Friends (背包DP + 滚动数组)