觉得上面说的很好。我只是想加一些自己的思考。
DP数组是记录的 以当前位置结尾的。
比如 ababab
当i=1时 此时就只有 a
当i=2时 此时只有 ab 但是ab串中也有a呀 为什么不要 因为上面说的是以 b结尾 所以最后一个一定要是b
当i=3时 此时 由 fail 数组可以得到 f【3】=1 也就是第一个a与第二个a匹配到了。所以加上ba串就是i=3 时候的前缀数
……
……
我已刻入灵魂
#include <iostream> #include <cstdio> #define MAXN 200005 using namespace std; int m; char P[MAXN]; int f[MAXN]; int dp[MAXN]; void getfail() { //int m=strlen(P); f[0]=0;f[1]=0; for(int i=1;i<m;i++) { int j=f[i]; while(j&&P[i]!=P[j])j=f[j]; f[i+1]=P[i]==P[j]?j+1:0; } } /*int find() { int n=strlen(T); int m=strlen(P); getfail(); int j=0; for(int i=0;i<n;i++) { while(j&&P[j]!=T[i])j=f[j]; if(P[j]==T[i])j++; if(j==m)printf("%d ",i-m+1); } } */ int main() { int CASE; scanf("%d",&CASE); while(CASE--) { scanf("%d",&m); scanf("%s",P); getfail(); dp[0]=0; dp[1]=1; int sum=1; for(int i=2;i<=m;i++) { dp[i]=dp[f[i]]+1; sum=(sum+dp[i])%10007; //printf("%d ",dp[i]); } cout<<sum<<endl; } }