CODE[VS] 1404 字符串匹配

来源:互联网 发布:java acl访问控制列表 编辑:程序博客网 时间:2024/06/05 16:02

题目地址: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;}


0 0