BZOJ 1511: [POI2006]OKR-Periods of Words KMP
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\n",cnt);
return 0;
}

浙公网安备 33010602011771号