用NEXT数组的性质 ,NEXT数组的值表示该位置下与前缀相同的位数。
cur[ i ] 储存 前缀 i 个字母与S串相同的数量。
#include<stdio.h>
#include<string.h>
#define MAX 100010
char s[100010];
long long next[100010],cur[100010];
long long len,sum;
void getnext()
{
long long i=0,j=-1;
next[0]=j;
while(i<len){
if(j==-1||s[i]==s[j])
i++,j++,next[i]=j;
else j=next[j];
}
}
int main(){
long long i,t;
scanf("%lld",&t);
while(t--){
getchar();
scanf("%s",s);
sum=0;
len=strlen(s);
getnext();
memset(cur,0,sizeof(cur));
cur[0]=1;
for(i=1;i<=len;i++){
if(next[i]>0)
cur[i]+=cur[next[i]]+1;//想到这步就好了。
else
cur[i]=1;
sum+=cur[i];
}
printf("%lld\n",sum);
}
return 0;
}