题意:给一个字符串,对每一个前缀出现的次数求和。
这里有另外一种思路:【KMP】HDU 3336 Count the string - KIDxの博客 - ITeye技术网站
#include <cstdio> #include <cstring> const int MOD=10007; const int N=200005; char s[N]; int next[N],n,f[N]; void getNext(char s[],int len) { next[0]=-1; int i=0,j=-1; while (i<len) { if (j==-1 || s[i]==s[j]) next[++i]=++j; else j=next[j]; } } int DP () { int ans=0; memset(f,0,sizeof(f)); for (int i=1;i<=n;i++) {//f[i]表示长度为i的字符串(也就是把str[i]当成'\0')总共含前缀的数量 f[i]=f[next[i]]+1;//+1表示长度为next[i]的前缀在当前结尾又出现了一次 ans=(ans+f[i])%MOD; } return ans; } int main () { int T; scanf("%d",&T); while (T--) { scanf("%d",&n); scanf("%s",s); getNext(s,n); printf("%d\n",DP()); } return 0; }