【kmp】AcWing160
传送门
题意是说给定长度为n的字符串A,长度为m的字符串B,q个询问
每次询问有A的所有后缀里有多少个使得与B的前缀匹配长度恰好为K
在对A字符串做匹配的时候,本来 f[i] = j
表示的是A中以A[i]结尾的后缀与B的前缀的最大匹配长度。现在要改一下定义。f[x]表示匹配长度至少为x的有多少个位置。
当A中以A[i]结尾的字符串与B的最大匹配长度为j的时候,证明产生了一个匹配长度至少为j的后缀,但是不一定是恰好为j,因为此时的A[i]结尾字串并不是A数组的后缀。然后需要发现:匹配长度至少为next[j]的后缀的数量也增加了。
于是f函数的各个函数值之间是拓扑的关系。f[k] = \sum\limits_{next[j]=k} f[j]
于是匹配长度恰好为x的数量就是f[ x ] – f[ x + 1 ]
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 233;
int n, m, q;
char a[maxn], b[maxn];
int ne[maxn], f[maxn];
int main()
{
cin >> n >> m >> q;
cin >> a + 1 >> b + 1;
ne[1] = 0;
for(int i =2, j = 0; i <= m; i++)
{
while(j >
… Read the rest