BZOJ 1511 KMP
题意:
求出每个前缀的最长周期之和(等于本身的算0)
思路:
求出来next数组 建出next树 找到不为0的最小的 n减去它就是答案
//By SiriusRen #include <cstdio> using namespace std; const int N=1000500; int n,next[N]; char s[N]; long long ans; void get_next(){ for(int i=2,j=0;s[i];i++){ while(j&&s[i]!=s[j+1])j=next[j]; if(s[i]==s[j+1])j++; next[i]=j; } } int main(){ scanf("%d%s",&n,s+1); get_next(); for(int i=1;i<=n;i++){ while(next[next[i]])next[i]=next[next[i]]; if(next[i])ans+=i-next[i]; }printf("%lld\n",ans); }