题目大意:给你一个字符串,求所有前缀在原串的出现次数之和
打个表推推,KMP+DP随便水水就过了吧
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 200100
#define mod 10007
#define ui unsigned int
using namespace std;
int T,n,m,len;
int nxt[N];
ui f[N];
char s[N];
void clr()
{
memset(f,0,sizeof(f));
memset(s,0,sizeof(s));
memset(nxt,0,sizeof(nxt));
}
void get_kmp()
{
int i=0,j=-1;
nxt[0]=-1;
while(i<=len)
{
if(j==-1||s[i]==s[j])
{
i++;
j++;
nxt[i]=j;
}else{
j=nxt[j];
}
}
}
ui solve()
{
ui ans=0;
for(int i=1;i<=len;i++)
{
if(nxt[i]>=0) f[i]=f[nxt[i]]+1;
else f[i]=1;
f[i]%=mod;
ans+=f[i];
ans%=mod;
}
return ans;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
clr();
scanf("%s",s);
len=strlen(s);
get_kmp();
printf("%u\n",solve());
}
return 0;
}