周期长度和
题目链接:周期长度和
题目描述

解题思路
根据题意,既然我们要求最长的周期,那么也就是要求最短的重合部分。
这不就是 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;
}

该博客探讨如何使用KMP算法解决求解字符串周期长度和的问题。通过构建next数组并进行递归查找,找到最短重合长度,从而得出最长周期。
210

被折叠的 条评论
为什么被折叠?



