简单kmp
由于next数组每次都和字符串的某一前缀进行匹配,则每次匹配成功便在前缀的位置+1,初始化所有位置为1,因为至少出现一次,最后跑一遍next,统计下结果就行了。
代码:
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
char s[200005];
int a[200005];
int p[200005];
int n;
const int mod=10007;
void getnext()
{
for (int i=2;i<=n;i++)
{
int j=p[i-1];
a[i]=1;
while (j>0&&s[j+1]!=s[i])
j=p[j];
if (s[j+1]==s[i])
j++;
p[i]=j;
a[j]++;
}
}
int main()
{
int r;
cin>>r;
while (r--)
{
cin>>n;
scanf("%s",s+1);
p[0]=p[1]=0;
memset(a,0,sizeof(a));
a[1]=1;
getnext();
int sum=0;
for (int i=n;i>=1;i--)
{
//a[i]=(a[i]+a[i+1])%mod;
sum=(sum+a[i])%mod;
//cout<<a[i]<<" "<<p[i]<<endl;
}
cout<<sum<<endl;
}
}