预处理b串 实质是求b串的前缀 和 后缀 的最大相同长度。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
const int mod=1e4+7;
char b[maxn];
int nex[maxn];
int m;
void pre(){
nex[1]=0;
int i,j=0;
for(i=1;i<m;i++){
while(j>0&&b[i+1]!=b[j+1])
j=nex[j];
if(b[i+1]==b[j+1]) j++;
nex[i+1]=j;
}
}
int main(){
int ans,t,i;
cin>>t;
while(t--){
cin>>m;
scanf("%s",b+1);
pre();
ans=m%mod;//一共m个模式串可取,所以ans至少有m
for(i=1;i<=m;i++){
if(nex[i]) //nex不为0 表示该处字符与前面的字符有匹配,所以+1
ans=(ans+1)%mod;
}
cout<<ans<<endl;
}
}