hdu 3336 kmp

来源:互联网 发布:橙树网络 编辑:程序博客网 时间:2024/05/16 10:07
//我们在这里使用的是算法导论中求解π数组的方法并且用到了dp // dp【i】=dp【next【i】】+1,dp【next【i】】在前面的计算中一定计算过了,//1表示的是到i本身的这个前缀,比如abab来说//next数组值为0012,dp[1]=dp[next[1]]+1=1//dp[2]=dp[next[2]]+1=dp[0]+1=1,dp[3]=dp[next[3]]+1=dp[1]+1=2,这是因为除了aba本身外还有一个最后的小a//dp[4]=dp[next[4]]+1=dp[2]+1=2,这是因为abab本身加上后面的ab,这个ab前面已经计算出来了 #include<iostream>using namespace std;char p[200005];int dp[200005];int next[200005];void compute_prefix(int len){    int k=0;    for(int q=2;q<=len;q++){        while(k>0&&p[k+1]!=p[q])            k=next[k];        if(p[k+1]==p[q])            k=k+1;        next[q]=k;    }}int main(){    int i,n,t,sum;    cin>>t;    while(t--){        sum=0;        memset(dp,0,sizeof(dp));        memset(next,0,sizeof(next));        cin>>n;        scanf("%s",p+1);        compute_prefix(n);        for(i=1;i<=n;i++){            dp[i]=dp[next[i]]+1;            sum=(sum+dp[i])%10007;        }        cout<<sum<<endl;    }    return 0;    }

原创粉丝点击