kmp中next数组的运用

来源:互联网 发布:excel怎么汇总数据 编辑:程序博客网 时间:2024/06/07 05:50
#include <iostream>#include<stdio.h>#include<string.h>#include<string>using namespace std;char a[ 200005];int  next[ 200005];int dp[ 200005];const int mod=10007;void build(int s){    int i;    next[1]=0;    int j=0;    for(i=2;i<=s;i++)    {        while(j>0&&a[j+1]!=a[i])            j=next[j];        if(a[j+1]==a[i])            j++;        next[i]=j;    }}/*void output(int x){    if(next[x]==0)    {        printf("%d ",x);        return ;    }    output(next[x]);    printf("%d ",x);}*/int main(){    int cas;    scanf("%d",&cas);    while(cas--)    {        int s;        scanf("%d",&s);        scanf("%s",&a[1]);        memset(next,0,sizeof(next));        build(s);        dp[0]=0;        int sum=0;        for(int i=1;i<=s;i++)        {            dp[i]=dp[next[i]]+1;            sum+=dp[i];            sum%=mod;        }        printf("%d\n",sum);    }    return 0;}

0 0