主要利用next数组
O(n)时间遍历字符串,计算当前以i结尾的字符串有几个和要求字符串匹配的
#include<stdio.h>
#include<string.h>
char s[100100];
int next[100100];
void getnext(){
int i=1,j=0,k;
next[1]=0;
k=strlen(&s[1]);
while(i<=k+1){
if(j==0 || s[i]==s[j]){
i++,j++;
next[i]=j;
}
else
j=next[j];
}
}
int main(){
int t,T,i,len;
int ans[100100];
long long all;
scanf("%d",&T);
for(t=1;t<=T;t++){
all=0;
scanf("%s",&s[1]);
memset(ans,0,sizeof(ans));
getnext();
len=strlen(&s[1]);
for(i=1;i<=len;i++){
ans[i]=ans[next[i+1]-1];
ans[i]+=1;
all+=ans[i];
}
printf("%lld\n",all);
}
}