题目
给出一个串A,求A串的所有前缀子串在A中出现的次数求和
思路
next数组表示的最大前后缀的长度,我们只要求出所有的next数组,对于next[i]=k说明前缀长度k的前缀子串出现一次,所以我们开一个map把每个对应长度的next前缀长度存起来,最后加上n就可以了
#include <iostream>
#include <map>
using namespace std;
const int MAXN=2e5+10;
char str[MAXN];
int snext[MAXN],n;
int mod=10007;
void getnext()
{
int j=0;
int k=snext[0]=-1;
while(j<n)
{
if(k==-1||str[j]==str[k])
{
j++;k++;
snext[j]=k;
}
else k=snext[k];
}
}
map<int,int> mp;
int main()
{
int T;cin>>T;
while(T--)
{
mp.clear();
cin>>n;
scanf("%s",str);
getnext();
for(int i=0;i<=n;i++)
mp[snext[i]]++;
int ans=0;
for(int i=1;i<=n;i++)
ans=(ans%mod+mp[i]%mod)%mod;
ans=(ans%mod+n%mod)%mod;
printf("%d\n",ans);
}
return 0;
}