考察next数组理解,next数组为第i个前的字符前缀能和后缀匹配的最大长度。所以如果next为0,则说明只有s[0,i)这一个字符串能匹配上,ans+1;如果next不为0,为x,则说明s[0,i)和s[i-x,i)都能匹配上,ans+2。从1遍历到n求解即可。
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int mod=10007;
const int maxn=2e5+10;
char s[maxn];
int n;
int nxt[maxn];
void get_next()
{
nxt[0]=-1;
int t1=0,t2=-1;
while(t1<n){
if(t2==-1||s[t1]==s[t2]) nxt[++t1]=++t2;
else t2=nxt[t2];
}
}
int main()
{
int t;scanf("%d",&t);
while(t--){
scanf("%d",&n);
scanf("%s",s);
get_next();
int ans=0;
for(int i=1;i<=n;i++) ans=nxt[i]!=0?(ans+2)%mod:(ans+1)%mod;
printf("%d\n",ans);
}
}