s的循环子串 kmp中next数组的应用

题目链接:洛谷p4391

题目描述

给你一个字符串,它是由某个字符串不断自我连接形成的。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少.

输入格式

第一行给出字符串的长度,1 < L ≤ 1,000,000.

第二行给出一个字符串,全由小写字母组成.

输出格式

输出最短的长度

输入输出样例

输入 

8
cabcabca

输出 

3

说明/提示

对于样例,我们可以利用"abc"不断自我连接得到"abcabcabc",读入的cabcabca,是它的子串

 

 

解析链接;洛谷解析

按照题意,读入字符串长度n和字符串s ;

这道题求的是字符串ss最小长度的循环,我们称之为“s的循环子串”,首先引入结论:

ans=n-next[n]

求出next数组(其实只求出next[n]就行了),即求出字符串的最大公共前后缀;

 

ac代码

# include<bits/stdc++.h> 
using namespace std;
const int maxn=1e6+10;
int nex[maxn];
char s[maxn],p[maxn];
int sLen,pLen;
void GetNext(char* p)
{
	nex[0] = -1;
	int k = -1;
	int j = 0;
	while (j < pLen)
	{
		if (k == -1 || p[j] == p[k]) 
		{
			++k;
			++j;
			nex[j] = k;
		}
		else 
		{
			k = nex[k];
		}
	}
}

//int KmpSearch(char* s, char* p)
//{
//	int i = 0;
//	int j = 0;
//	while (i < sLen&& j < pLen )
//	{
//		if (j == -1 || s[i] == p[j])
//		{
//			i++;
//			j++;
//		}
//		else
//		{  
//			j = nex[j];
//		}
//	}
//	if (j == pLen)
//		return i - j;
//	else
//		return -1;
//}

int main(){
	int n;
	cin>>n;
	cin>>p;
	pLen=strlen(p);
	GetNext(p);
	
	for(int i=1;i<=pLen;i++){
		cout<<nex[i]<<' ';
	}
	return 0;
}

阿里云建站—为企业提供互联网“快”服务

2020年因为一场突如其来的疫情,不少企业受到了严重冲击,疫情的冲击力对传统“纯线

下”行业的危害最大,互联网女皇玛丽·米克(MaryMeeker)4月17日发布了著名的年度互

联网趋势报告,报告中指出:拥有强大的互联网线上线下融合能力的企业在疫情中的表现最好,

线上线下融合的趋势已经存在一段时间了,但是疫情让这种需求变得更加的迫切。

如果你的企业完全依附于传统的、纯线下的经验模式,那么在2020年你将“必死无疑”,

一场巨大的,前所未有的互联网革命已经到来!

阿里云建站为了助力各行各业复工复产,疫情期间“马不停蹄”为数以万计的企业快速完成

建站,为他们朝着“线上线下融合”或者“纯线上”的互联网经营模式迈进,打下了坚实的基础。

“云·速成美站”模板建站1天就能上线,不懂技术没关系,打字就能建网站。千套网站模

板免费提供,百元就能建官网,一价全包,无任何隐形消费。

“云·企业官网”定制建站1周就能上线,高端量身定制建站,千元建官网无需自己动手,

建站专家1对1网站策划及设计,专业省心之选。

疫情,是一场大浪淘沙,每一次危机背后都隐藏着机会,危机越大,机会也越大。大环境

已经改变,如果你不努力不去改变来迎合这个大环境,那你必将被淘汰。

阿里云助力企业建站,优惠多多,福利多多,详情请点击如下链接

红包+折扣,阿里云上云大礼包! https://www.aliyun.com/minisite/goods?userCode=nvs9lx2m

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值