hihocoder #1015 KMP

#include<stdio.h>

#include<iostream>

#include<math.h>

#include<string.h>

using namespace std;

int n,m;//记录两个数组的长度 

char a[1000001],b[100000];//打入需要比较的串和比较的串 

int p[11111];//记录next函数 

void getp()

{

    p[1]=0;

    int i,j=0;

    for(i=2;i<=m;i++)

    {

        while(j>0&&b[j+1]!=b[i]) j=p[j];

        if(b[j+1]==b[i]) j+=1;

        p[i]=j;

    }

}//高端大气求next 

int kmp()

{    

    int i,j=0,cnt=0;

    for(i=1;i<=n;i++)

    {

        while(j>0&&b[j+1]!=a[i]) j=p[j];

        if(b[j+1]==a[i]) j+=1;

        if(j==m){

            cnt++;

            j=p[j];

        }

    }

    return cnt;    

}//低调奢华搞定kmp 

int main()

{

    int t;

    cin>>t;

    while(t--)

    {

        scanf("%s%s",b+1,a+1);

        m=strlen(b+1);

        n=strlen(a+1);

        getp(); 

        for(int i=1;i<=m;i++)

        cout<<p[i]<<endl;

        cout<<kmp()<<endl;

    }

    return 0;

}//顺利求解啦啦啦 

既然你学KMP这么NB,那不如跟着我一起学做菜吧,啊哈哈

你可能感兴趣的:(code)