在长度为m的目标串里寻找长度为n的模式串,暴力法需要o(mn)的时间复杂度。如果要寻找k个模式串,总共需要o(mnk)的时间。本题中m<10^3,且有nk<10^3,所以暴力法是可以接受的。
我们可以用KMP的方法,将单词寻找模式串的长度减少为o(m+n),从而降低复杂度。
与KMP的模板题类似,我们要对每一个模式串p预处理得到它的“自相关最长前后缀数组”lsp。略微不同的是,我们在每次进行s和p的匹配时,需要在目标串s中指定一个起始位置cur。这样每一个回合,s和p的互相关最长前后缀数组的计算只需要从cur开始。如果能够找到匹配的起始位置i,那么下一个回合的起始位置就从cur = i+p.size()开始寻找。