题意:求模式串在主串中出现的次数【可重叠】
Sample Input
3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN
Sample Output
1
3
0
对代码中神奇的地方进行解释:

那么3的意义可以表示为

可见next[len2]的意义:前缀和后缀的最长匹配长度
现在就以这个为模式串模拟一下:
主串: A B A B A B C A B A B A A B
模式串:A B A B C A B A
匹配成功后下一步的情况应为:
主串: A B A B A B C A B A B A A B
模式串: A B A B C A B A
指针直接移动到红色部分进行匹配
如何理解呢?
我们先不看最后那2个字符A和B,就可以发现最大前缀【指前缀和后缀的最长匹配长度】直接挪动到最大后缀那里了,为什么可以这样呢?因为前面都是显然不能够匹配成功的
可以向前移动一位试试看:
主串: A B A B A B C A B A B A A B
模式串: A B A B C A B A
我们先不看最后那2个字符A和B,可以看到现在是4长度的前缀与4长度的后缀比较,显然不
可匹配,因为最大匹配长度是3【指前缀和后缀的最长匹配长度】,显然再向前移也不行的
第一次长篇大论,若有错误或不明白之处,请指出
C++代码
#include
#include
#include
#include
#include
//#include