hdu3336kmp,dp

来源:互联网 发布:b2b2c 分销 java 编辑:程序博客网 时间:2024/05/22 04:29

http://acm.hdu.edu.cn/status.php
求给出字符串的所有前缀在原字符串中出现的次数和

思路 每个前缀是不是都要去和 串的以某个节点结尾的后缀去匹配,KMP的思想就是找出每个位置i的可匹配最大前缀j。
令dp[i]表示S[0,i-1]串的后缀能匹配的前缀个数,那么dp[i]=dp[next[i]]+1, dp[1]=1正好表示串s[0]的后缀只能匹配串s[0].

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;char s[200005];int nex[200005];int dp[200005];int n;void getnext(){    int len=n;    nex[0]=-1;    int i=0,j=-1;    while(i<len)    {        if(j==-1||s[i]==s[j])        {            i++;            j++;            nex[i]=j;        }        else            j=nex[j];    }}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%d%s",&n,s);        getnext();        int sum=0;        dp[0]=0;        for(int i=1; i<=n; i++)        {            dp[i]=dp[nex[i]]+1;            sum+=dp[i];            sum%=10007;        }        printf("%d\n",sum);    }    return 0;}
0 0
原创粉丝点击