题目地址:http://codevs.cn/problem/1404/
毕竟是中文题目,题目意思在上面很明显了,就是计算从A的任意位开始的子串和B匹配的长度,求出匹配长度恰为x的位置有多少个?
这题是一题裸的kmp,不过稍微需要思考下
代码附上:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=200012;
int next[MAXN],m,n,k,x,js[MAXN];
char a[MAXN],b[MAXN];
void build_next()
{
int i,j;
j=0; next[1]=0;
for (i=2;i<=m;i++)
{
while ((j>0)&&(b[i]!=b[j+1])) j=next[j];
if (b[i]==b[j+1]) j++;
next[i]=j;
}
return ;
}
void Count()
{
int i,j=0;
for (i=1;i<=n;i++)
{
while ((j>0)&&(a[i]!=b[j+1])) j=next[j];
if (a[i]==b[j+1]) j++;
js[j]++;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
scanf("%s",&a[1]);
scanf("%s",&b[1]);
build_next();
Count();
/* 下面两句话是精华,可以思考下*/
for (int i=m;i>0;i--) js[next[i]]+=js[i];
for (int i=0;i<m;i++) js[i]-=js[i+1];
while (k--)
{
scanf("%d",&x);
printf("%d\n",js[x]);
}
return 0;
}