题目链接
分析
求最长周期就需要求最小重合部分
KMP的next数组就是
最后用总长度减去它就是最长周期
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char x[1000010];
int n,k,next[1000100];
long long ans;
int find(int y)
{
if(next[y]!=0) return next[y]=find(next[y]);
return y;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x[i];
}
k=0;
for(int i=1;i<=n-1;i++)
{
while(k>0&&x[i+1]!=x[k+1]) k=next[k];
if(x[i+1]==x[k+1]) k++;
next[i+1]=k;
}
for(int i=1;i<=n;i++)
{
ans+=(i-find(i));
}
cout<<ans;
return 0;
}