周期长度和
题目链接:周期长度和
题目描述
解题思路
根据题意,既然我们要求最长的周期,那么也就是要求最短的重合部分。
这不就是 k m p kmp kmp 的 n e x t next next 数组吗?
我们先求 n e x t next next 数组,然后利用递归的方式找到最短的重合长度,再用原长度减去它就是最长周期了。
查找的时候可以压缩一下路径(不用的话会 T L E TLE TLE),就像这样:
int find(int a)
{
if(nxt[a])
return nxt[a]=find(nxt[a]);
return a;
}
code
#include<iostream>
#include<cstdio>
#include<string>
#define int long long
using namespace std;
string s;
int n,ans;
int nxt[1000010];
int find(int a)
{
if(nxt[a])
return nxt[a]=find(nxt[a]);
return a;
}
void qnxt()
{
int i=0,j=-1;
nxt[0]=-1;
while(i<n)
{
if(j==-1||s[i]==s[j])
j++,i++,nxt[i]=j;
else
j=nxt[j];
}
}
signed main()
{
cin>>n>>s;
qnxt();
for(int i=1;i<=n;i++)
ans+=i-find(i);
cout<<ans<<endl;
}