shift-And / shift-Or 算法

自备ACM模板 —— 字符串篇 KMP //打印 s2 串在 s1 串的位置 洛谷 P3375 #include<bits/stdc++.h> using namespace std; int net[1000005]; char s1[1000005], s2[1000005]; void getnet(char s[]){ int i = 0, j = -1, len = strlen(s); net[0] = -1; while(i < len){ if(j==-1||s[j]==s[i]) net 阅读详情

原文链接:http://www.cnblogs.com/longdouhzt/archive/2011/09/25/2190550.html

Shift-And算法思想较之KMP算法很简单,设模式字符串为P,它主要通过保存一个集合D(D中记录了P中所有与当前已读text的某个后缀相匹配的前缀),每当text有新的字符读入,算法利用位并行机制来更新这个集合D。

  设P长度为m,则集合D可表示为D = dm…d1 而用D[j]代表dj

  D[j]=1当且仅当p1…pj 是 t1…ti 的某个后缀,当D[m]=1时,就认为P已经于text匹配。

  当读入下一个字符 ti+1, 需要计算新的集合 D′. 当且仅当D[j]=1并且  ti+1 等于 pj+1时D'[j+1]=1. 这是因为D[j]=1时有 p1…pj 是 t1…ti 的一个后缀,而当ti+1 等于 pj+1可推出p1…pj +1是 t1…ti+1 的一个后缀.这个集合可通过位运算来更新.

  算法首先建立一个数组B, 数组长度为text串所属字符集长度(例如A-Z的话数组B的长度为26.)  如果P的第j为等于c则将B[c] 中第j位置为1.

因为要预处理计算B,如果字符集很大的话,并不划算。如果m很长的话(大于机器字长),也很不方便。所以这种算法适用于字符集较小,模式串小于机器字长的情况。当然对于模式串较长的情况,也是比brute force要快的,只是逻辑上要复杂些。


  Shift-And的代码如下,这里假设字符集的大小为128


复制代码
int shift_and(char * s, int len_s, char * p, int len_p)
{
     int B[128];
     memset(B, 0, sizeof(B));

     int i;
     for (i=0; i<len_p; i++)
        B[p[i]] |= 1<<i;

     int D = 0;
     for (i=0; i<len_s; i++)
     {
        D = ((D<<1) | 1) & B[s[i]];  //D<<1与1位或操作,是可以让匹配随时从当前字符开始,使用位运算实现了并行
        if (D & (1<<(len_p-1)))
         return i - len_p+1;
     }
     return -1;
}
复制代码

Shift-Or算法跟Shift-And算法思想是一样的,只是在通过取补,减少了位运算的次数,提高了速度。Shift-Or作的修改是,用零表示一个数在集合里,1表示不在,所以

D = ((D<<1) | 1) & B[s[i]];

修改为D=D<<1 | B[s[i]]; 省了一次位运算,当然B和D的初始化的时候,也要作相应的修改。




====================================================================


My Code:


Shift-And



复制代码
int size = 128; // 此处默认字符集规模为128

//预处理,
void preShiftAnd(const char *p, int m, unsigned int *s){
    for(int i=0; i<size; i++)
        s[i] = 0;
    for(int i=0; i<m; i++){
        s[p[i]] |= 1<<i;
    }
}

//Shift—And
int ShiftAnd(const char *t, const char *p){
    int tLen = strlen(t);
    int pLen = strlen(p);
    unsigned int state = 0;            //即D数组
    unsigned int s[size];

    if(tLen < pLen) return -1;

    preShiftAnd(p, pLen, s);     //预处理

    for(int i=0; i<tLen; i++){
        state = ((state<<1)|1) & s[t[i]];
        if(state & 1<<(pLen-1))            //最高位出现零
            return i - pLen + 1;
    }
    return -1;

}
复制代码



Shift-Or


复制代码
#define WORDSIZE sizeof(int)*8 
#define ASIZE 256                                    // 只考虑ASCII码字符集

int preSo(const char *x, int m, unsigned int S[]) { 
    unsigned int j, lim; 
    int i; 
    for (i = 0; i < ASIZE; ++i) 
        S[i] = ~0;                                    // 初值都是全1的二进制数
    for (lim = i = 0, j = 1; i < m; ++i, j <<= 1) { 
        S[x[i]] &= ~j;                                // 当第 J 位为 I 的时候, S[I][J] = 0;
        lim |= j; 
    } 
    /*
    for (i = 0; i < m; i++) { 
        cout << x[i] << " Feature " << bitset<sizeof(int)*8>( S[x[i]]) << endl;
    } 
    */
    lim = ~(lim>>1); 
    return(lim); 
} 

int SO(const char *x, int m, const char *y, int n) { 
    unsigned int lim, state; 
    unsigned int S[ASIZE]; 
    int j; 
    if (m > WORDSIZE) { 
        cout << "SO: Use pattern size <= word size"; 
        return -1;
    }

     /* Preprocessing */ 
     lim = preSo(x, m, S); 

     /* Searching */ 
     for (state = ~0, j = 0; j < n; ++j) { 
         state = (state<<1) | S[y[j]]; 
             if (state < lim) 
                 return j - m + 1; 
         } 
     return -1;
} 



原文链接:http://www.douban.com/note/321872072/

Shift-And/Shift-Or 算法和KMP 算法一样,也是线性时间复杂度的字符串匹配算法,运行时间上甚至要比KMP 算法快得多。而理解上比KMP 算法更容易一些。Shift-And/Shift-Or 算法设计的非常巧妙,初次接触时同样“吓了一跳”。
Shift-And 与 Shift-Or 算法的原理完全一样,区别仅在于Shift-Or 对Shift-And 做了一点儿改进。我们先说Shift-And 算法。

与上一篇透彻理解KMP算法 中描述的问题相同,S 表示原字符串,T 表示目标串(模式串),我们要在S 中搜索T。
令 S[0..m-1] = abcabcabdabba, T[0..n-1] = abcabd

1,Shift-And 算法思想
Shift-And 算法的核心思想是利用掩码D 来记录模式串的前缀匹配情况。(瞧,shift 算法的核心也是前缀匹配)。Shift 算法大量应用了位运算。
D 是一个m 位的无符号整数:D[n-1, n-2, ..,1,0] (注意D 并不是一个数组,仅仅是一个整数,D[n-1] 表示其最高位bit)。
数组索引i 控制S 串的扫描,当扫描的字符S[i] 时,D 的第j 位D[j] = 1 当且仅当T[0..j] 是S[0..i] 的一个后缀。

要使用Shift 算法,需要一个辅助表B。B 是一个字典,key 是问题域字符集中的每个字符,value 是一个n 位无符号整数,记录该字符在模式串T 的哪些位置出现。
例如,字符c 在T[2] 处出现,那么B['c'] = 000100 (对于字符串,低位在左;对于B['c'],低位在右);同理,a 在T[0],T[3] 处出现,B['a'] = 001001.

假设当前处理到S[i],需要对D 进行更新。由于D[j] (0<j<n) 标识T[0..j] 是否是S[0..i] 的后缀,所以D[j]=1 当且仅当更新前的D[j-1]=1 并且S[i]==T[j];D[0] 是边界情况,D[0]=1 当且仅当S[i]==T[0]。
所以,D = (D << 1 | 1) & B[S[i] ;
显然,当D[n-1]=1 时,表示T[0..n-1] 是S[0..i] 的后缀,此时找到一个T的完全匹配。

2,Shift-And 算法实现
Shift-And 匹配过程代码:

 

由于位运算在计算机中可以并行进行,每次循环的执行是常数时间的,所以上面代码段的复杂度是 O(m)。

3,辅助表 B
上面没有提到如何得到辅助表B。很简单,只要获得模式串T 中每个字符出现的位置。
 

显然,上述代码段的复杂度是 O(n)。Shift-And 算法的时间复杂度是O(m+n)。
实际上,shift 算法通常比KMP 算法的匹配速度要快,因为计算机位并行运算是非常高效的。

注意:数组B 的大小是由字符集决定的,如果字符来自ASCII 码,字符的数值范围是0~127,数组大小是128 即可;否则,可能需要更大的数组B,或者自己构建字符到整数索引之间的散列关系。

4,Shift-Or 算法
在Shift-And 中,对掩码D 的更新:D = (D << 1 | 1) & B[S[i] ;
每次更新D 都需要额外进行D 移位后与"1" 的"或"运算。这是由于我们要保证当字符S[i] 在T[0] 处出现时,D[0] 一定要等于1,而D 向左移位后最低位是0。

如果将Shift-And 中核心的“与” 运算改为“或” 运算,可以节省这一个附加的“或1” 运算。这正是Shift-Or 所改进的地方。
Shift-Or 与Shift-And 的唯一区别在于,在Shift-Or 中,“有效位” 是通过0(而不是1)来标识。
于是求解辅助表B 和更新掩码D 都会与Shift-And 有一些区别,详见代码。

Shift-And 完整代码: C++ 实现 Python 实现
Shift-Or 完整代码: C++ 实现 Python 实现




原文链接:http://www.cnblogs.com/ACystalMoon/archive/2012/12/30/2839293.html

这个算法利用了位运算的优势速度很快,易于实现,缺点是模式串不能太长。据说在适用范围内速度是kmp的至少2倍。算法思想是用一个数字prefix的二进制去表示模式串的前缀,prefix的二进制第i位表示模式串的前缀0~i。如果这个前缀i是当前搜索到的匹配串的后缀时,将第i位至1。算法就是从匹配串的第0个字符到最后一个字符不断更新prefix的值每次更新后看最长的前缀(即模式串)的位是否被至1,如果是说明得到了一个匹配。

  下面说明下更新的过程。假如求出了比较匹配串第j位时的prefix,现在求比较j+1位的情况:prefix第i位为1当且仅当prefix第i-1位为1(匹配了i-1个字符),并且第i位所在字符和匹配串第j+1个字符相等。按下面实现来说,每次循环将prefix左移一位,第0位至一,在&上一个代表第i个字符是否匹配模式串某位的数字(这个通过初始化得到),就得到更新后的prefix。

  shiftAnd和shiftOr的思想一致。只是实现时存的是反码,因为prefix左移自然引入第0位的是0,为了减去或运算,才引入反码表示。

上代码~

复制代码
 1 //return a hashtable 代表字母表中的各个元素是否能成为模式串的后缀,用64位位压缩表示
 2 long long * initAlphbat(char *patternString)
 3 {
 4     long long *hash = (long long *) malloc(256 * sizeof(long long));
 5     unsigned int idx = 0;
 6     int psLen = strlen(patternString);
 7 
 8     if(hash == NULL) return NULL;
 9 
10     memset(hash, 0, 256 * sizeof(long long));
11     for(idx = 0; idx < psLen; ++idx)
12     {
13         hash[(unsigned int)patternString[idx]] |= ((long long)1 << idx); //表示patternString[idx]代表字符可以是在模式串的哪些位置
14     }
15 
16     return hash;
17 }
18 
19 //the patternString length must be less than 64
20 MatchingInfo * ShiftAnd(char *patternString, char *dataString, unsigned int dsLen)
21 {
22     unsigned int idxDs = 0, psLen = strlen(patternString);
23     long long *hash = initAlphbat(patternString);
24 
25     long long prefix = 0;  //每一位表示一个模式串的前缀,如果该位是1则表示当前该前缀被匹配上
26 
27     if(hash == NULL) return NULL;
28 
29     //匹配信息的初始化
30     MatchingInfo *mi = (MatchingInfo *)malloc(sizeof(MatchingInfo));
31     if(mi == NULL) return NULL;
32     mi->indexOfMatch = (unsigned int *)malloc(sizeof(unsigned int));
33     mi->numOfMatch = 0;
34     mi->allocLen = 1;
35 
36     //下面的循环中动态更新prefix
37     for(idxDs = 0; idxDs < dsLen; ++idxDs)
38     {
39         prefix = (prefix << 1) | 1;
40         prefix &= hash[(unsigned int)dataString[idxDs]];
41         if(prefix & ((long long)1 << (psLen - 1)))
42         {
43             //匹配上一个模式串
44             if(mi->allocLen > mi->numOfMatch)
45             {
46                 //记录下标的内存够用
47                 mi->indexOfMatch[mi->numOfMatch++] = idxDs - psLen + 1;
48             }
49             else
50             {
51                 //扩张匹配下标的内存
52                 mi->indexOfMatch = (unsigned int *)realloc(mi->indexOfMatch, (mi->allocLen << 1) * sizeof(unsigned int));
53                 mi->allocLen <<= 1;
54                 mi->indexOfMatch[mi->numOfMatch++] = idxDs - psLen + 1;
55             }
56         }
57     }
58 
59     free(hash);
60     hash = NULL;
61     return mi;
62 }



LINK : http://www.cnblogs.com/Kenfly/archive/2011/07/22/2114108.html

Shift-And 与 Shift-Or算法

当模式字符串长度数比机器字短和总字符集个数比较少时,Shift-And与Shift-Or算法平均效率是KMP的两倍,下面是Shift-And算法,Shift-Or是同样我思想,只不过用位0表示真状态

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 void shiftAnd(char *t, char *p)
 5 {
 6     int lenP = strlen(p);
 7     int b[26] = {0};
 8     for(int i = 0; p[i]; ++i)
 9     {
10         b[p[i] - 'a'] |= 1 << i;
11     }
12 
13     int status = 0;
14     for(int i = 0; t[i]; ++i)
15     {
16         status = ((status << 1) | 1) & b[t[i] - 'a'];
17         if(status & (1 << (lenP - 1)))
18             printf("%d\n", i - lenP + 1);
19     }
20 }
21 
22 int main()
23 {
24     char T[100];
25     char P[32];
26     scanf("%s%s", T, P);
27     shiftAnd(T, P);
28     return 0;
29 }


shift and add算法介绍 立即下载

相关推荐

手把手教你用CubeMX给GD32F103点灯、调串口(附完整工程)

本文详细介绍了如何使用CubeMX为GD32F103开发板配置GPIO点灯和串口通信,包含完整的工程创建、代码构建和测试流程。特别强调了GD32与STM32的差异点及常见避坑技巧,帮助开发者快速上手GD32开发。

weixin_42566424的博客 313

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

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

qq_34603425的博客 1252

Windows非分页缓冲池内存泄漏实战:PoolMon与RAMMap高效排查指南

本文详细介绍了Windows系统中非分页缓冲池内存泄漏的实战排查方法。当系统出现卡顿且内存占用异常增长时,通过RAMMap工具快速定位非分页缓冲池异常,并利用PoolMon监控内核内存分配标签,精准锁定泄漏源。文章提供了从确认症状、安装工具到使用findstr命令溯源驱动文件的完整五步排查流程,并总结了常见泄漏标签与解决方案,帮助用户高效解决深层系统内存问题。

weixin_28455801的博客 1011

17 | 数据结构(下):大整数实战,提升 Shift-And 算法能力

上节呢,我们讲了大整数表示法的相关知识,并且给你演示了大整数加法及乘法处理过程。其实,你是否掌握了大整数表示法是次要的,主要是你可以在这个过程中,认识到数据结构的作用,也就是强调的。原先,我们之所以无法做较大整数的运算,那是因为我们所掌握的数据类型,无法表示很大的数字,有了大整数表示法以后,我们就可以做特别特别大的整数表示了。之前也一直在说,算法是做数据计算的,它和数据结构是程序设计中非常重要的两部分。既然是两部分,说明。关于这点呢,你可以想想上节课我们学的大整数加法,它其实就是算法。为什么这么说呢。

qq_37756660的博客 1016

通达信抓波段指标(主图)

VAR3:=IF(INBLOCK('科创板'),VART20,IF(INBLOCK('创业板') AND DATE>1200823,VART20,IF(INBLOCK('ST板块'),VART5,VART10)));VAR5:=IF(INBLOCK('科创板'),CT20,IF(INBLOCK('创业板') AND DATE>1200823,CT20,IF(INBLOCK('ST板块'),CT5,CT10)));曾涨停/紫色细K线:青字"炸",涨停未封住。曾跌停/蓝色细K线:红字"撬",跌停被打开。

q125500612的博客 2140

爬取国家统计局最近10年年度数据

一、编码流程 1.目标网址:https://data.stats.gov.cn/easyquery.htm?cn=C01 2.编码思路: (1) 解析左侧指标树,实现4级标签定位 (难点:层层嵌套,下一级指标的xpath路径以上一级指标为基础;不是所有二级指标都含有三和四级指标,需要进行判断) (2) 使用selenium webdriver 点选指标,加载出右侧表格数据 (难点:当指标无法在全局页面显示时,需向下拖动滚动条) (3) 解析右侧数据,实现数据存储 3.使用模块: (1) selenium:解

weixin_39645690的博客 4561

Shift-And / Shift-Or

神妙的战法! 先介绍Shift-And Task:在s中里找t 做法 遍历s,采访到s的第i位的时候,用bitset记录t中哪些前缀,是s.substr(1,i)的后缀。 如果在这个bitset中第j位为1 那么: s[i] = t[j] 第j-1位,在采访到s的第i-1位的时候,为1 由此,我们推导出从i-1到i位,bitset的转移。 for(int i=0;t[i];i++) B...

weixin_34152820的博客 433

保姆级教程:在Ubuntu 22.04上从零安装SUMO并运行第一个交通仿真

本教程详细介绍了在Ubuntu 22.04系统上从零安装SUMO交通仿真软件并运行第一个仿真的完整流程。涵盖环境准备、PPA源安装、核心组件验证、首次仿真案例运行以及进阶配置技巧,特别针对netedit路网编辑器和地图格式转换等实用工具进行重点讲解,帮助用户快速掌握SUMO在交通仿真领域的应用。

weixin_30546189的博客 423

【算法09】经典匹配算法: KMP、Sunday与ShiftAnd

如果文本串中,出现了模式串中根本没出现过的字符,那么模式串应该向后移动整个模式串的长度。sunday算法适合处理在一篇文章中,查找一个单词。如果每次都向后这样子跳啊,sunday算法的时间复杂度最好能到达O(n/m),m是单词的长度,n是文章的长度。所以sunday算法在实际场景中是远优于kmp,远优于暴力匹配的。

weixin_55252589的博客 1320

S32K1XX Autosar开发实战|全网独家复现EB MCAL Port/Dio配置、详解引脚分层原理、实现经典跑马灯助力车载IO电控落地

在NXP S32K1XX系列车规MCU的AUTOSAR标准开发体系中,MCAL(微控制器抽象层)是软硬件解耦的核心载体,而Port端口模块与Dio数字IO模块是MCAL最基础、最核心的入门模块,也是车载指示灯、按键检测、继电器驱动、外设硬件启停控制的底层支撑。区别于传统裸机直接操作寄存器的开发方式,AUTOSAR架构采用分层隔离设计,Port负责硬件静态初始化、Dio负责动态电平操控,严格遵循车规级开发规范,杜绝硬件资源冲突、引脚配置混乱等问题。

getusushu的博客 44

UE实现贴地线(SurfaceLine)效果

UnrealEngine实现贴地线效果

专注GIS开发 4572

shift-and,shift-or算法

shift-and,shift-or算法shift-and,shift-or算法shift-and算法shift-or算法 shift-and,shift-or算法 维护一个字符串的集合,集合中的每个字符串既是模式串P的前缀,同时也是已读入文本的后缀。每读入一个新的文本字符,该算法即用位并行的方法更新集合。该集合用一个位掩码D=dm…d1来表示。 shift-and算法 p为模式串(长度为m),t为文本串。 ​ D的第j位被置为1当且仅当p0…pj是t0…tj的后缀。当dm为1时,就表示有一个成功的匹配。

addmission的博客 1257

java.sql.SQLIntegrityConstraintViolationException: #23000

java.sql.SQLIntegrityConstraintViolationException: #23000**异常信息****异常原因****解决方法** 异常信息 ### Cause: java.sql.SQLIntegrityConstraintViolationException: #23000 ; #23000; nested exception is java.sql.SQLIntegrityConstraintViolationException: #23000] with root c

123 4356

字符串匹配-Shift-And/Shift-Or算法

   字符串匹配-Shift-And/Shift-Or算法     

深未来技术 773

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

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

[基于前缀搜索的算法] shift-and/shift-or算法

与KMP算法一样,shift-and 和shift-or算法都是基于前缀搜索的字符串匹配算法。但是该算法的思想比KMP简单很多,它维护一个字符串的集合,集合中的每个字符串既是模式串P的前缀,同时也是已读入文本的后缀。每读入一个新的文本字符,该算法即用位并行的方法更新集合。该集合用一个位掩码D=dm......d1来表示。 先说shift-and算法。 D...

weixin_30832351的博客 355

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

从自动机(NFA to DFA)角度去理解KMP和Shift-And/Shift-or算法

    晚上没事情翻起《柔性字符串匹配》(《Flexible Pattern Matching inStrings》)看,发现好多都忘记了,就从头开始从KMP看起来,个人感觉这本书上对KMP的描述比较晦涩,不像在网上搜索到的都是在说明模式函数next那么好理解,但是这本书确是从本质上去描述KMP的——使用自动机的方法来进行模式串匹配,使得我们理解了这个本质,可以明白它不仅仅可以用来查找

5898

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

20190619——网络程序设计 算法部分

蛮力算法 蛮力法(brute force method,也称为穷举法或枚举法)是一种简单直接地解决问题的方法,常常直接基于问题的描述,所以,蛮力法也是最容易应用的方法。但是,用蛮力法设计的算法时间特性往往也是最低的,典型的指数时间算法一般都是通过蛮力搜索而得到的 mp 匹配追踪算法 现在我们需要知道的是向后滑动几个字符。我们怎么判断向后滑动的字符数呢?当然是滑动到其当前后缀与前缀相同的最大位置,例...

寄蜉蝣于天地,渺沧海之一粟。 224

C++ std::bitset详解:位运算优化与图算法加速

位运算作为底层计算的高效手段,在状态压缩与集合处理中拥有独特优势。位图(BitMap)利用每个二进制位表示状态,极大降低内存占用,而C++标准库的std::bitset则将这些优势封装为易用的容器。它支持整组按位与、或、异或、取反及移位操作,提供count、any等统计接口,编译器会将其优化为按机器字批量处理,相比手工逐位循环显著提升性能。在邻接矩阵传递闭包、位图集合交并差、Shift-And字符串匹配以及埃氏筛等场景中,std::bitset能将复杂度从O(N^3)降至O(N^3/word_len),是算

weixin_31364787的博客 255

高性能字符串匹配算法的模式优化研究技术4

模式预处理技术多模式匹配优化

absunique的博客 587

shift- add / shift or

Shift-And算法思想较之KMP算法很简单,设模式字符串为P,它主要通过保存一个集合D(D中记录了P中所有与当前已读text的某个后缀相匹配的前缀),每当text有新的字符读入,算法利用位并行机制来更新这个集合D。   设P长度为m,则集合D可表示为D = dm…d1 而用D[j]代表dj   D[j]=1当且仅当p1…pj 是 t1…ti 的某个后缀,当D[m]=1时,就认为P已经于text

Just Me 1146

俩个模式匹配算法(BMH and shift-Or)

BMH描叙:The Boyer-Moore-Horspool (BMH) algorithm [Horspool 1980] is a widely-knownsearch algorithm for a single pattern. The preprocessing phase of the algorithmconsists of calculating the bad charact

tjltail的专栏 2738

shift and算法

1. CF 914FSubstrings in a String 大意: 给定一个串s, q个询问, (1)单点修改, (2)询问[l,r]范围内串y的出现次数. shift and算法板子题 #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mm...

weixin_30783913的博客 194

【笔记】Shift-And算法&Shift-OR算法

Shift-And S表示原串,T表示目标串,要在S中搜索T D是一个bitset:D[n-1,n-2,...,1,0]共n位 x控制S串的扫描,当扫描到字符S[x]时,D的第y位D[y]=1当且仅当T[0..y]是S[0..x]的一个后缀 B是一个map,key是题目字符集合,value是一个bitset,记录该字符在模式串T的哪些位置出现 例如,字符c 在T[2] 处出现,...

weixin_30443813的博客 897

Shift-And算法

Shift-And算法 用于每一位可以匹配多个字符的情况 使用bitset实现 kmp思想寻找模式串的前缀与匹配串后缀的最大匹配长度 Regular Number 题意 模式串每位可以匹配0-9的多个数字 输出与模式串匹配的匹配串 思路 waring :在输入输出字符串的时候puts和gets会快很多 先用bitset记录每种值所在的位置 for (int i = 0; i < 1...

qcwlmqy的博客 629
上一篇: KMP,深入讲解next数组的求解
下一篇: 结构体struct 联合体union 及内存对齐
Aiphis7
博客等级 码龄12年 39粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值