#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
vector<int> nxt;
vector<int> getnxt(string s) {
int n = (int)s.length();
vector<int> pi(n);
for (int i = 1; i < n; i++) {
int j = pi[i - 1];
while (j > 0 && s[i] != s[j]) j = pi[j - 1];
if (s[i] == s[j]) j++;
pi[i] = j;
}
return pi;
}
int T,n;char s[N];
int f[N],ans=0,cnt[N];
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);scanf("%s",s);
vector<int> v=getnxt(s);ans=0;
// for(int i=0;i<n;i++){
// ans++;int tp=v[i];
// while(tp){
// ans++;
// tp=v[tp-1];
// }
// ans%=10007;
// }
for(int i=0;i<n;i++) cnt[i]=0;
for(int i=0;i<n;i++) cnt[v[i]]++;
for(int i=n-1;i>=1;i--) cnt[v[i-1]]+=cnt[i];
for(int i=0;i<n;i++) ans+=cnt[i],ans%=10007;
printf("%d\n",ans);
}
}
Count the string(KMP 前缀个数
最新推荐文章于 2021-09-01 18:34:55 发布