博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shift-and 算法初体验
阅读量:6278 次
发布时间:2019-06-22

本文共 1082 字,大约阅读时间需要 3 分钟。

shift-and算法的思想与kmp的算法思想类似,更简单

shift-and算法的适用范围是字符串匹配,但是此时模板串可以有很多个

题意:模式串有n位长度,n的大小是1000,每一位有x种选择,x的大小是10,也就是说模式串组合的话,大约可以组合出来10^1000种,于是普通的AC自动机什么的都GG了

shift-and是用bitset实现的,bitset是高端卡常题的宠儿,很少被我使用的经典STL

bitset可以想象成是vector容器,对于每一位只占用一个字节,也就是char型的八分之一的大小,于是省时又省空间

需要注意的是:假设声明bitset<int>foo;  那么foo[0]会显示在最右端,foo[n-1]会显示在最左端,刚好与普通的数组是相反的

foo.set()  全部设置为1

foo.reset()   全部设置为0

foo.set(x)    将foo[x]设置成1

foo.reset(x)  将foo[x]设置成0

按照代码理解吧~

首先是输入部分

 

build() 函数的作用是构建bitset ,  solve() 函数就是解决问题 具体怎么实习的后面介绍

首先我声明的bitset长度就是n的大小,10个bitset,记录的就是每一个数字可以出现在第几位

接下来ans也是一个bitset,他记录我们在处理过程中的结果

每一步 我们就将当前位直接置1,询问这一位是否可以匹配,与前面的,当前面也可以,这一步也可以的话,那么这一个就匹配成功

代码如下:

#include
#include
#include
#include
#include
#include
using namespace std; const int maxn = 1003; int n , x , num; vector
V[maxn]; char s[5000006]; bitset
b[13] , ans; void build() { for(int i=0; i<10; i++) { b[i].reset(); } ans.reset(); for(int i=0; i

 

转载于:https://www.cnblogs.com/Flower-Z/p/9772534.html

你可能感兴趣的文章
Python系语言发展综述
查看>>
新手 开博
查看>>
借助开源工具高效完成Java应用的运行分析
查看>>
163 yum
查看>>
nginx 限速
查看>>
html5 聊天机器人
查看>>
第三章:Shiro的配置——深入浅出学Shiro细粒度权限开发框架
查看>>
openstack虚拟机修改IP地址
查看>>
80后创业的经验谈(转,朴实但实用!推荐)
查看>>
初识 lex
查看>>
让Windows图片查看器和windows资源管理器显示WebP格式
查看>>
我的友情链接
查看>>
TCP and UDP Small Servers
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
Linux的dd命令
查看>>
从服务器下载一个离线包,格式为gz的压缩包,怎么解压呢。
查看>>
vim使用点滴
查看>>
embedded linux学习中几个需要明确的概念
查看>>
mysql常用语法
查看>>