题意:
封装了一个可KMP匹配的类结构,比较高效。
代码:
#include <iostream>
#include <string>
#include <vector>
class ModelString
{
private:
std
::string s
;
std
::vector
<int> dp
;
public:
ModelString();
ModelString(std
::string s
);
std
::vector
<int> kmp(std
::string t
);
};
ModelString
::ModelString() {
s
.clear();
dp
.clear();
}
ModelString
::ModelString(std
::string s
) {
this->s
= s
;
dp
.push_back(-1);
for (int i
= 1; i
< s
.length(); i
++) {
if (s
[i
] == s
[dp
[i
- 1] + 1]) {
dp
.push_back(dp
[i
- 1] + 1);
}
else {
int now
= i
- 1;
while (now
!= -1 && s
[i
] != s
[dp
[now
] + 1]) {
now
= dp
[now
];
}
if (now
== -1) {
dp
.push_back(-1);
}
else {
dp
.push_back(dp
[now
] + 1);
}
}
}
}
std
::vector
<int> ModelString
::kmp(std
::string t
) {
std
::vector
<int> ret
;
int i
= 0, j
= 0;
while (i
< s
.length()) {
if (s
[i
] != t
[j
]) {
if (j
!= 0) {
j
= dp
[j
- 1] + 1;
}
else {
i
++;
}
}
else {
i
++, j
++;
if (j
== t
.length()) {
ret
.push_back(i
- t
.length());
j
= dp
[j
- 1] + 1;
}
}
}
return ret
;
}
int main()
{
int T
;
std
::cin
>> T
;
while (T
--) {
std
::string s
, t
;
std
::cin
>> t
>> s
;
ModelString ans
= ModelString(s
);
std
::cout
<< ans
.kmp(t
).size() << std
::endl
;
}
}
转载请注明原文地址: https://mac.8miu.com/read-514084.html