之前搞过这个,这次可能由于VJ 上没记录之前在hdu 交的 又见到了。。。搞了个dp。。
kmp + dp 解决。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+5;
const int mod=10007;
int nex[maxn*2],dp[maxn*2]; char s[maxn*2];
inline void getFail(char *s)
{
int i = 0, j = -1;
nex[0] = -1;
int len = strlen(s);
while(i < len)
{
if(j == -1 || s[i] == s[j])
nex[++i] = ++j;
else
j = nex[j];
}
}
int main()
{
int t;cin>>t;
while(t--)
{
memset(nex, 0, sizeof nex);
int len;scanf("%d",&len);
scanf("%s",s);
getFail(s);
int sum = 0;dp[0] = 0;
for(register int i=1;i<=len;i++)
dp[i] = 1;
for(int i=1;i<=len;i++)
{
dp[i] = (dp[nex[i]]+1)%mod;
sum = (sum+dp[i]) % mod;
}
/*for(int i=0;i<=len;i++)
cout<<nex[i]<<' ';
cout<<endl;
for(int i=0;i<=len;i++)
cout<<dp[i]<<' ';
cout<<endl;*/
printf("%d\n",sum);
}
return 0;
}