Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6062 Accepted Submission(s): 2810
#include<stdio.h> #include<string.h> #define mod 10007 #define MAX 200010 char p[MAX]; int f[MAX]; int dp[MAX]; void getfail() { int i,j; f[0]=f[1]=0; int len=strlen(p); for(i=1;i<len;i++) { j=f[i]; while(j&&p[i]!=p[j]) j=f[j]; f[i+1]=p[i]==p[j]?j+1:0; } } int main() { int n,m,j,i,s,t; scanf("%d",&t); while(t--) { scanf("%d",&n); scanf("%s",p); getfail(); s=0; dp[0]=0; for(i=1;i<=n;i++) { dp[i]=(dp[f[i]]%mod+1)%mod; s=(s%mod+dp[i]%mod)%mod; } printf("%d\n",s); } return 0; }
喝豆浆 3336 Count the string【kmp算法求前缀在原字符串中出现总次数】
原文:http://www.cnblogs.com/tonghao/p/4670877.html