前缀次数总和=前缀种类数+每种前缀在后面的出现次数
贴一个不错的题解,但是题解有个地方讲的不是太清晰,就是为什么next【j】+1==next【j+1】的时候就不统计了呢?
http://972169909-qq-com.iteye.com/blog/1114968
因为如果next等于后一个next值加一的话,这次的统计会在后面也被统计到,所以忽略
#include<stdio.h>
#include<string.h>
#define val 200005
int next[val],lenp;
char p[val];
void set_next();
int main()
{
int cas,i,ans;
for(scanf("%d",&cas);cas;cas--)
{
scanf("%d",&lenp);
scanf("%s",p);
set_next();
ans=lenp+next[lenp];
for(i=lenp-1;i>=1;i--)
if(next[i]!=next[i+1]-1)
ans+=next[i];
printf("%d\n",ans%10007);
}
return 0;
}
void set_next()
{
int k,j;
k=-1,j=0;
next[j]=k;
while(j<lenp)
{
if(k==-1||p[j]==p[k])
{
k++;
j++;
next[j]=k;
}
else k=next[k];
}
}