题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6629
扩展kmp模板了解一下
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define ll long long
const int maxn=1000010;
int next1[maxn],ex[maxn];
void GETnext1(char *str)
{
int i=0,j,po,len=strlen(str);
next1[0]=len;
while(str[i]==str[i+1]&&i+1<len)
i++;
next1[1]=i;
po=1;
for(i=2;i<len;i++)
{
if(next1[i-po]+i<next1[po]+po)
next1[i]=next1[i-po];
else
{
j=next1[po]+po-i;
if(j<0)j=0;
while(i+j<len&&str[j]==str[j+i])
j++;
next1[i]=j;
po=i;
}
}
}
void EXKMP(char *s1,char *s2)
{
int i=0,j,po,len=strlen(s1),l2=strlen(s2);
GETnext1(s2);
while(s1[i]==s2[i]&&i<l2&&i<len)
i++;
ex[0]=i;
po=0;
for(i=1;i<len;i++)
{
if(next1[i-po]+i<ex[po]+po)
ex[i]=next1[i-po];
else
{
j=ex[po]+po-i;
if(j<0)j=0;
while(i+j<len&&j<l2&&s1[j+i]==s2[j])
j++;
ex[i]=j;
po=i;
}
}
}
char a[maxn], b[maxn];
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
scanf("%s", a);
int n = strlen(a), m = 0;
for(int i = 1; i < n; i++) b[m++] = a[i];
b[m] = '\0';
ll ans = 0;
EXKMP(b, a);
for (int i = 0; i < m; i++){
if(ex[i] != m - i)
ans += ex[i] + 1;
else
ans += ex[i];
}
cout << ans << endl;
}
return 0;
}