首页 > 编程语言 > 详细

P3435 [POI2006]OKR-Periods of Words KMP算法扩展

时间:2020-09-16 18:11:50      阅读:48      评论:0      收藏:0      [点我收藏+]

题意:

对于一个仅含小写字母的字符串$q,p$ 为 \(a\) 的前缀且 \(a \ne p\),那么我们称 \(p\)\(a\) 的 proper 前缀。

规定字符串 \(Q\)(可以是空串)表示 \(a\) 的周期,当且仅当 \(Q\)\(a\) 的 proper 前缀且 \(a\) 是 $Q+Q$的前缀。

例如 ababab 的一个周期,因为 ababab 的 proper 前缀,且 ababab+ab 的前缀。

求给定字符串所有前缀的最大周期长度之和。

范围&性质:$1\le k\le 10^6$

分析:

借用别人的图,侵删

技术分享图片

这里利用了next数组的性质:$next[i]$表示$i$的最长的前缀和后缀相同的长度

如图可得对于字符串$i$,令$j=i$,然后在$j>0$的情况下令$j=next[j]$最大周期就是$i-j$

代码:

#include<bits/stdc++.h>

using namespace std;

namespace zzc
{
	const int maxn = 1e6+5;
	int n;
	long long ans;
	char ch[maxn];
	int nxt[maxn];
	
	void work()
	{
		scanf("%d",&n);
		scanf("%s",ch+1);
		for(int i=2,j=0;i<=n;i++)
		{
			while(j&&ch[i]!=ch[j+1]) j=nxt[j];
			if(ch[i]==ch[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",ans);
	}
	
}

int main()
{
	zzc::work();
	return 0;
}

P3435 [POI2006]OKR-Periods of Words KMP算法扩展

原文:https://www.cnblogs.com/youth518/p/13679775.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!