#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1e6+7;
int s[maxn];//文本串
char p[2000010];//匹配串
int next[2000010];//匹配串的next数组
void GetNext(int n)
{
int pLen = n;
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen)//坑点啊,模板是只求出了next[n-1],但是这题需要求next[n]。。。。。!!
{
//p[k]表示前缀,p[j]表示后缀
if (k == -1 || p[j] == p[k])
{
++k;
++j;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int main()
{
#ifdef xxz
freopen("in.txt","r",stdin);
#endif // xxz
int Case;
cin>>Case;
while(Case--)
{
int n,m;
cin>>n;
cin>>p;
int ans = 0;
GetNext(n);
for(int i = 1; i <= n; i++)
{
if(next[i] > 0) ans++;
if(ans >= 10007) ans %= 10007;
}
ans += n;
ans %= 10007;
cout<<ans<<endl;
}
return 0;
}
HDU3336(KMP)
最新推荐文章于 2021-06-15 18:35:46 发布