KMP 的 fail 指针指向的位置是具有循环节性质的.
code:
#include <bits/stdc++.h> #define ll long long #define N 1000020 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,nxt[N]; char a[N]; int main() { // setIO("input"); scanf("%d%s",&n,a+1); ll cnt=0; for(int i=2,j=0;i<=n;++i) { for(;j&&a[j+1]!=a[i];)j=nxt[j]; if(a[j+1]==a[i]) ++j; nxt[i]=j; } for(int i=2,j=2;i<=n;++i,j=i) { while(nxt[j]) j=nxt[j]; if(nxt[i]) nxt[i]=j; cnt+=i-j; } printf("%lld ",cnt); return 0; }