https://cn.vjudge.net/problem/HDU-3336
题意:求一个字符串中所有前缀在这个字符串中出现的总次数(可重叠)。
思路:利用next数组dp一遍,然后求一遍dp的总和。
#include<iostream>
#include<stdio.h>
using namespace std;
#define ll long long
#define mod 10007
int nx[200004];
char a[200004];
void get_nx(int n)
{
nx[0]=0;
int i,j=0;
for(i=1; i<n; i++)
{
while(j>0&&a[i]!=a[j])
j=nx[j-1];
if(a[i]==a[j])
j++;
nx[i]=j;
}
}
int main()
{
int t,n,dp[200006];//dp[i]为以第i个结尾的最长后缀(前缀)中前缀的个数
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
scanf("%s",a);
get_nx(n);
int ans=0;
for(int i=0; i<n; i++)
{
if(nx[i]==0)
dp[i]=1;
else
dp[i]=1+dp[nx[i-1]];
ans=(ans+dp[i])%mod;
}
printf("%d\n",ans);
}
return 0;
}