【笔记】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] 处出现,那么B['c'] = 000100 (对于字符串,低位在左;对于B['c'],低位在右);同理,a 在T[0],T[3] 处出现,B['a'] = 001001.

初始D[0]=1当且仅当S[i]=T[0]

假设当前处理到S[x],需要对D进行更新,D[j]=1当且仅当D[j-1]==1&&S[i]=T[j]

所以 D=(D<<1|1)&B[s[x]];

Shift-OR

用0表示一个数在集合里,1表示不在

D=(D<<1)|B[s[x];B,D初始化全1

猜你喜欢

转载自www.cnblogs.com/greenty1208/p/9709851.html