HDU 5972 Regular Number Bitset优化字符串匹配

【算法竞赛学习笔记】Bitset详解和应用 title : bitset date : 2021-8-20 tags : ACM,数据结构 author : Linno Bitset bitset是一种类似数组的数据结构,它的每一个元素只能是0或1,每个元素只用1bit的空间。可以使用只包含‘0’或‘1’的字符串构造。 优点 支持所有的位运算。 空间占用非常小,也可用于优化时间。 声明方式 #include<bitset> bitset<30>bi; string s="100101"; bitset<10>. 阅读详情

题意:
给一个长度为n的模式子串,子串的每个位置分别可以是一些数字,即一个位置可以被多个数字匹配。再给定一个母串,问子串可以在哪些位置和木串匹配,并且输出匹配成功后的所有子串。
解题方法:
对于每一个数字建立一个bitset,然后对于每个bitset b[i]的数字来说, 如果允许它出现在字串j的位置,就让b[i][j] = 1。维护一个bitset ans,枚举母串的每一个位置i,先将ans向高位移一位,再将ans的最低位置1后与这个位置的数字对应的bitset相与。这样,如果ans[k]=1表示从这个位置开始往前的长度为k+1的串可以和子串的前缀进行匹配。当ans[n-1]的时候,说明从i-n+1位置开始的母串可以和子串匹配,这个时候输出即可。由于巨大的io,所以需要加上FastIO才能通过。

这个思路画个图如下:

把这个bitset理解为竖起的

代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N = 5e6+5;
bitset <1005> b[12];
typedef long long LL;
struct FastIO
{
    static const int S = 2 * N;
    int wpos;
    char wbuf[S];
    FastIO() : wpos(0) {}
    inline int xchar()
    {
        static char buf[S];
        static int len = 0, pos = 0;
        if (pos == len)
            pos = 0, len = fread(buf, 1, S, stdin);
        if (pos == len) exit(0);
        return buf[pos ++];
    }
    inline int xuint()
    {
        int c = xchar(), x = 0;
        while (c <= 32) c = xchar();
        for (; '0' <= c && c <= '9'; c = xchar()) x = x * 10 + c - '0';
        return x;
    }
    inline int xint()
    {
        int s = 1, c = xchar(), x = 0;
        while (c <= 32) c = xchar();
        if (c == '-') s = -1, c = xchar();
        for (; '0' <= c && c <= '9'; c = xchar()) x = x * 10 + c - '0';
        return x * s;
    }
    inline void xstring(char *s)
    {
        int c = xchar();
        while (c <= 32) c = xchar();
        for (; c > 32; c = xchar()) * s++ = c;
        *s = 0;
    }
    inline void wchar(int x)
    {
        if (wpos == S) fwrite(wbuf, 1, S, stdout), wpos = 0;
        wbuf[wpos ++] = x;
    }
    inline void wint(LL x)
    {
        if (x < 0) wchar('-'), x = -x;
        char s[24];
        int n = 0;
        while (x || !n) s[n ++] = '0' + x % 10, x /= 10;
        while (n--) wchar(s[n]);
    }
    inline void wstring(const char *s)
    {
        while (*s) wchar(*s++);
    }
    ~FastIO()
    {
        if (wpos) fwrite(wbuf, 1, wpos, stdout), wpos = 0;
    }
} io;
char s[N];
int main(){
    int n;
    while(1)
    {
        n = io.xint();
        for(int i = 0; i < 10; i++) b[i].reset();
        for(int i = 0; i < n; i++){
            int x, y;
            x = io.xint();
            while(x--){
                y = io.xint();
                b[y][i] = 1;
            }
        }
        io.xstring(s);
        bitset <1005> ans;
        for(int i = 0; s[i]; i++){
            ans <<= 1;
            ans[0] = 1;
            ans &= b[s[i]-'0'];
            if(ans[n-1]){
                for(int j = i - n + 1; j <= i; j++) io.wchar(s[j]);
                io.wchar('\n');
            }
        }
    }
    return 0;
}
使用 C++ 中的 Bitsets 容器类型来优化位运算 上面的代码中,我们首先创建了一个长度为 10 的 bitsets 容器对象,然后向容器中添加了一些值,并输出整个 bitsets 容器类型的内容。例如,在需要进行二进制计数的情况下,使用 bitsets 可以极大地提高代码的可读性和效率。在实际编程过程中, bitsets 容器类型可以帮助我们更加高效地处理位级别的数据,从而提高代码的可读性和效率。Bitsets 的基本用法非常简单,首先需要 include bitset 头文件,然后通过定义 bitset 对象来创建一个 bitsets 容器类型的实例。 阅读详情

相关推荐

HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化

我本身不是做天线设计的,所以HFSS这个软件给我主要还是做PCB级别的高速信号完整性仿真,一般2.5D的仿真软件无法对过孔和跨平面进行仿真。所以要借助三维电磁软件进行。今天就针对PCB进行裁剪。为什么要裁剪?以为如果把整个PCB一起仿真的话,应该要好几个月吧。所以为了加快仿真速度,必须进行裁剪仿真。①candence的PCB可以直接导入。那么先导入brd文件,file-import-candence结果如下②点击cutout,选中要仿真的net和参考平面。这里最好选creat new不然会把原文件覆盖掉。注

gjatwfn的专栏 1万+

bitset优化

bitset对于暴力的优化

qq_41418557的博客 800

hi3516cv610在PQStream上实现拉出图像,windows和板端操作记录

PQStream拉出图像

weixin_51838255的博客 728

bitset优化(bitset枚举一个序列所有子集)

这里写目录标题C++标准库bitset对象的初始化及操作bitset上场 C++标准库bitset对象的初始化及操作 // bit当作数组,下标0对应的是最右边的元素 bitset<10> bit; bit[0]=1;//0000000001 cout<<bit<<endl; bit[9]=1;//1000000001,上次的bit[0]=1噢 cout<<bit<<endl; bitset<10> b(string(

qq_51070956的博客 1746

几种负载均衡策略(DNS、NAT、重定向、反向代理)

摘要:本文对比了四种负载均衡技术:DNS负载均衡通过域名解析分发IP,用户直连服务器;NAT负载均衡通过VIP转发流量,所有流量经过负载均衡器;HTTP重定向通过302跳转实现分流;反向代理则隐藏后端服务器,统一转发请求。DNS简单但调度不精准,NAT精准但有带宽瓶颈,HTTP重定向延迟高,反向代理性能好但需专用设备。适用场景各异,DNS适合异地分流,NAT适合内网集群,HTTP重定向适合简单分流,反向代理适合高并发场景。核心区别在于层级(3层/7层)和流量走向(直连/中转)。

echo的博客 71

危废焚烧优化控制系统设计与实现:基于数据驱动的控制参数预测

本文提出了一种基于数据驱动的危险废物焚烧过程优化控制方法。系统利用历史运行数据和实时监测数据,通过深度学习模型预测关键控制参数,实现焚烧过程的智能化控制。系统采用Python开发,结合TensorFlow/PyTorch框架,构建了完整的数据采集、预处理、特征工程、模型训练和实时预测闭环系统。该系统能够处理多变量非线性关系,适应工况变化,从历史数据中学习最优控制策略,相比传统PID控制方法具有显著优势。论文详细介绍了系统架构、算法设计和实现细节,为危废焚烧过程的优化控制提供了有效解决方案。

huanghm88的专栏 206

字符串经典匹配算法之shift_and算法

字符串经典匹配算法之shift_and算法。shift_and算法的总体思路是把模式串预处理成一种特殊编码形式,然后根据这种编码形式去逐位匹配文本串。shift_and算法的时间复杂度为O(n),可以用于处理流式数据,同时可以用于处理复杂的正则表达式,比如模式串的每一位可能是多个字符。因为shift_and算法的预处理兼容性非常强。

qq_34603425的博客 1252

MuJoCo 入门教程(四)建模

在 MJCF 中,一个体可以包含多个关节,因此无需引入虚拟体来创建复合关节。相反,只需在同一主体中定义构成所需复合关节的所有原始关节即可。例如,可以使用两个滑块和一个铰链来模拟在平面内运动的肢体。其他 MJCF 元素可以在嵌套的主体元素所创建的树中定义,特别是关节、几何体、场地、摄像机、灯光。当一个元素被定义在一个肢体内时,它就固定在该肢体的局部坐标系上,并始终随其移动。涉及多个机构或根本不涉及机构的元素,将在运动树之外的单独部分中定义。

机器人控制与仿真应用 4163

hdu 5972 Regular Number bitset优化字符串匹配

题目链接 题意: 给一个长度为n的模式子串,子串的每个位置分别可以是一些数字,即一个位置可以被多个数字匹配。再给定 一个母串,问子串可以在哪些位置和母串匹配,并且输出匹配成功后的所有子串. 思路: 建立一个n位的bitset,对于输入的对应位置i可匹配的数字k,将其b[k][i]位置置1,表示该数字可以在第i个位置匹 配,维护一个bitsetans,每次将ans左移一位,并将最

Marcus-Bao的个人主页 1208

大模型部署指南:SGLang 框架

本文介绍使用 SGLang 框架部署大模型

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 1612

C# MES通信从入门到精通(1)——串口传输文件

本文详细介绍了在Mes通信领域如何使用串口发送文件,由实战经验总结,堪称MES通信领域的葵花宝典!

qq_34059233的博客 3751

HDU 5972 Regular Number Bitset优化字符串匹配 +Shift-And算法

可以参考:http://www.iteye.com/topic/1130001 的Shift-And/Shift-Or算法; 参考:http://blog.youkuaiyun.com/just_sort/article/details/54562523题意: 给一个长度为n的模式子串,子串的每个位置分别可以是一些数字,即一个位置可以被多个数字匹配。再给定一个母串,问子串可以在哪些位置和木串匹配,并且输出匹

now_ing的博客 289

AI绘画与医疗可视化:用AI生成医学插图的实践

医疗可视化是医学教育、临床沟通和学术研究的核心工具。传统医学插图依赖手工绘制或专业3D建模,存在制作周期长、成本高、更新迭代慢等问题。随着深度学习技术的发展,AI绘画工具(如Stable Diffusion、DALL-E)展现出强大的图像生成能力,但医疗领域对插图的解剖准确性、标注规范性和语义完整性有极高要求,通用AI模型难以直接应用。本文聚焦AI技术与医疗领域的交叉创新,系统阐述如何通过数据预处理、模型定制化训练和后处理校验,构建符合医疗标准的插图生成系统。

大模型应用工坊 1788

hdu 5972 Regular Number (bitset优化匹配) 2016大连现场赛

解题思路:暴力匹配过程太慢,我们考虑怎么优化这个过程,画图分析的话,最显然的是我们对文本串第 i 个字符进行了多次重复匹配 ,而我们又不能列出所有的模式串,所以无法使用KMP算法。 所以考虑建立10个长度为1000的bitset,分别记录数字0-9会出现在模式串的第几位。 再建立一个长度为1000的bitset a, a[i] 表示从以当前文本串位置 j 为结尾的长度为 i  的子串能否和模式

wchhlbt的博客 361

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

HDU-5972 Regular Number

【HDU-5972 Regular Number】 题意: 给定一个正则表达式, 求一个字符串中所有的匹配。(字符串都是数字字符) 分析: 题目中的正则表达式给定的格式是:给定这个匹配的位数, 然后给定每个位数上的可以匹配的数字。在这里引入STL中的bitset, bitset类可以轻松地设置一个二进制位,对于这道题, 将给定的正则表达式转化成bitset的格式, 对于每一个数字【0-9】将他的所...

YancyKahn 508

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

HDU 5972 Regular Number(字符串shift - and算法)

题目链接 HDU5972 2016 ACM/ICPC 大连区域赛 B题 我们预处理出$b[i][j]$,$b[i][j] = 1$的意义是数字$i$可以放在第$j$位。 然后就开始这个匹配的过程。 假设字符串第一位下标从$1$开始 我们每一次处理的子串为$s[i-n+1]$,$s[i-n+2]$, $s[i-n+3]$, ..., $s[i]$ $ans[k] = 1$的含义是 $s...

weixin_30336061的博客 222

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

HDU5972 Regular Number (bitset匹配)

使用bitset&lt;N&gt; b[10] ,b[i][j]表示值为i的数可以出现在子串的那些位置,即下标,那么对主串进行遍历 i=0:len-1 。另外定义一个变量bitset&lt;N&gt; ans ,每次先将ans左移一位,然后将最低位置1,然后令k=当前输入的数,将ans=ans&amp;b[k], 如果当前ans[N-1]==1,那么主串s[i-N+1]~s[i]就是合法子串,输出...

兜率工的博客 245

hdu 5972 Regular Number(Shift-And算法)

题目链接:hdu 5972 Regular Number 题意: 给你一个字符串,现在让你输出该字符串所有的合法子串。 合法子串定义为:对应位置的字符合法。 对应位置的合法字符会给你。 题解: 据说这是一个名字叫做Shift-And算法。其实就是一个bitset优化的字符串匹配。 这里我将它写成板子。 1 #include<bits/stdc++.h> 2...

weixin_30949361的博客 134

HDU 5972 Regular Number(shift and 模板)

/* Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc++.h> #define mp make_pair #define pb push_back #define endl '\n' using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair&

lifehappy 321

HDU 5972 Regular Number

Regular Number http://acm.hdu.edu.cn/showproblem.php?pid=5972 题意:   给定一个字符串,求多少子串满足,子串的第i位,只能是给定的数(小于等于9)。 分析:   Shift_and算法。bitset优化。   bitset<N>p[26]:p[c]表示字符c在子串出现的位置的集合。   bitset<N...

weixin_30888027的博客 119

hdu 5972 Regular Number

传送门 Bitset优化。 对每一个数字开一个Bitset,若第i位为1表示第i位可以为这个数字。 再开一个Bitset ans计算答案,每次ans左移一位,ans[0]=1(ans[0]是最右边一位),然后&上串的这一位的数字对应的bitset。 到某个时候长串到了i这一位,ans中j这一位是1,表示长串的i这一位可以匹配短串的j这一位,也就是说长串i之前的可以完全匹配0~j-1...

weixin_30780649的博客 71

bitset优化dp

给定1e5个数,要求是否能选出一个子序列,使得子序列的和为n的倍数。 由鸽巢原理和前缀和,如果子序列的长度大于等于n,那么答案一定是YES,小于n就需要借助dp来判断了。 这里又是bitset的奇淫技巧。思想是,普通的状态可达dp式子是f[ i ][ j ] = f[ i - 1][ j ] | f[ i - 1][ j - a[ i ] ].也就是继承上一层同一位置的j或上一层不同位置的j-a[i]。因此可以用移位代替减法。 题目链接:求3600的倍数 #include<bits/stdc++.h&

ATXTKS的博客 857

巧用Bitset!优化dp

本文主要介绍了bitset的用法,bitset的好处,以及如何用bitset去优化dp来节省时间和空间,并结合两个例题NC17193简单瞎搞题和NC276144小红组比赛非常详细的分析,希望对你有所帮助

2402_88147924的博客 1476

字符串匹配之Shift_and算法

Shift_and是一种时间始终稳定在O(n)的算法。 这种算法首先需要将子串 t 预处理为二进制模式,举个例子如图子串为“aecaebf”就可以通过位运算通过一个数字记录下在字符串中出现的位置,比如a字母出现在第0位和第3位,则储存a字母的数组中的数字就为202^020 + 232^323 = 9,依次采用相同的方法将每个子串出现位置的二进制模式记录在数字数组中。 接下来就是匹配的过程,最为重要的公式为: P=(P<<1∣1)P=(P<<1 | 1)P=(P<<1

weixin_44269491的博客 1091

Bitset容器与优化

某种神奇的容器,用于存储二进制。“” 中的内容代表容器的长度,相当于一个数组,但是每一位只能存储0或1,所以每一位占用1bit 的内存。赋值方法分两种,一种像字符串一样的,会直接把这一串数字存入。一种是填入一个数值,会把这个数转成二进制存储。这个时候,我们发现两种复制方法用了不同的方式处理。第一种取了最左边的5位,第二种取了最右边的5位。但是它们都不会报错。补充一下如果存入的位数不足,会用前导零填充。0/1这么玩的话会报错。

2401_84512298的博客 1257
上一篇: Shift and 算法 模板记录
下一篇: 51Nod 1532 DP + bitset 优化
just_sort
博客等级 码龄11年 2357粉丝 1667原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值