kmp+dp
dp[i]表示长度为i的前缀子串和
dp[j]=dp[i]+1,next[j]=i
因为在字符串p中,p[0...i]=p[j-i+1...j],也就是说p[0...i]在后面也出现了一次
1 #include<stdio.h> 2 #include<string.h> 3 char str[200005]; 4 int next[200005]; 5 int dp[200005]; 6 int n; 7 8 void getNext() 9 { 10 int i=0,k=-1; 11 next[0]=-1; 12 while(i<n) 13 { 14 if(k==-1||str[i]==str[k]) 15 { 16 i++; 17 k++; 18 next[i]=k; 19 } 20 else 21 k=next[k]; 22 } 23 } 24 25 int main() 26 { 27 int t; 28 scanf("%d",&t); 29 while(t--) 30 { 31 scanf("%d",&n); 32 scanf("%s",str); 33 getNext(); 34 memset(dp,0,sizeof(dp)); 35 int sum=0; 36 for(int i=1;i<=n;i++) 37 { 38 dp[i]=(dp[next[i]]+1)%10007; 39 sum+=dp[i]; 40 sum%=10007; 41 } 42 printf("%d\n",sum); 43 } 44 return 0; 45 }