Luogu_P3435 [POI2006]OKR-Periods of Words
### KMP
题目链接阅读理解
其实就是B是A的前缀
那么叠加B成为BB,假如A是BB的前缀那么B就是合法
问A的所有合法前缀的和
emmm感性理解吧
那么读懂题面也就可以解决了
KMP的\(nxt[]\)数组就是自我匹配的位置
而且\(nxt[]\)是可以递推,假如\(nxt\)都不为\(0\)
\(nxt[x]\)和\(nxt[nxt[x]]\)的末尾都是x这个数
为了求最长,就让\(nxt[i]\)最短,让\(nxt[x]=nxt[nxt[x]]\)
那么\(i-nxt[i]\)就是最长的长度
求和就可以了
代码如下:
#include<bits/stdc++.h> using namespace std; int n,nxt[1000010]; long long ans; char s[1000010]; int main() { cin>>n>>(s+1); for(int i=2,j=0;i<=n;i++){ while(j && s[i]!=s[j+1]) j=nxt[j]; if(s[i]==s[j+1]) 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; ans+=i-j; } printf("%lld\n",ans); return 0; }