intptr_t BM_find(const char
*
t, size_t lt, const char
*
s, size_t ls)
{
/
/
建立跳转表
size_t
*
Tpkmp
=
new size_t[ls];
intptr_t k
=
0
, coiled
=
1
;
/
/
计算子串特征_[
next
表]
for
(size_t i
=
1
; i < ls; i
+
+
)
{
if
(s[i]
=
=
s[k]) {
+
+
k; }
else
{ k
=
(s[i]
=
=
s[
0
]) ?
1
:
0
; }
Tpkmp[i
-
1
]
=
i
-
k;
}
/
/
优化表
k
=
-
1
;
for
(size_t i
=
0
; i < ls
-
1
; i
+
+
)
{
if
(s[i]
=
=
s[ls
-
1
]) { k
=
i; }
if
(s[i]
=
=
s[i
+
1
] && coiled)
{
Tpkmp[i
+
1
]
=
Tpkmp[i] >
+
+
coiled ? Tpkmp[i] : coiled;
}
else
{
coiled
=
0
;
}
}
Tpkmp[
0
]
=
ls
-
k
-
1
;
for
(size_t i
=
1
; i < ls; i
+
+
)
{
if
(Tpkmp[ls
-
i] < Tpkmp[
0
]) { Tpkmp[ls
-
i]
=
Tpkmp[
0
]; }
}
/
/
开始制作哈希表
char Thash[
256
];
for
(size_t i
=
0
; i <
256
; i
+
+
) { Thash[i]
=
ls; }
for
(size_t i
=
0
; i < ls; i
+
+
) { Thash[(size_t)s[i] &
0xff
]
=
ls
-
1
-
i; }
/
/
制表到此完成
ls
-
=
1
;
lt
-
=
ls;
intptr_t out
=
-
1
;
/
/
开始遍历搜索
for
(size_t i
=
0
; i < lt;)
{
/
/
坏字符
if
(Thash[(size_t)
*
(t
+
i
+
ls) &
0xff
]) { i
+
=
Thash[(size_t)
*
(t
+
i
+
ls) &
0xff
]; goto fail; }
/
/
好字符
for
(size_t n
=
0
; n < ls; n
+
+
)
{
if
(
*
(t
+
i
+
n) !
=
*
(s
+
n)) { i
+
=
Tpkmp[n]; goto fail; }
}
/
/
找到_结束循环
out
=
i;
break
;
fail:;
}
/
/
收尾工作
delete[] Tpkmp;
return
out;
}