本题即是找给定字符串的前缀个数。
首先用kmp算法预处理一下字符串,得到Next数组,
然后设dp[i]表示前i个字符中以str[i]字符结尾的前缀个数,则dp[i]=dp[Next[i]]+1。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
const int INF=200005;
const int MOD=10007;
char str[INF]; //存储字符串
int dp[INF],p[INF];
//kmp算法预处理p数组
void GetP(int len)
{
int j=0;
p[1]=0;
for(int i=2;i<=len;i++)
{
while(j>0 && str[j+1]!=str[i])
j=p[j];
if(str[j+1]==str[i])
j++;
p[i]=j;
}
}
int main()
{
int ncase,m;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d%*c%s",&m,str+1);
GetP(m);
int sum(0);
dp[0]=0;
for(int i=1;i<=m;i++)
{
dp[i]=dp[p[i]]+1;
sum=(sum+dp[i])%MOD;
}
printf("%d\n",sum);
}
return 0;
}