魔岛大陆-2星题也简单

文章描述了一个编程挑战,要求找到字符串中的最长前缀,该前缀在字符串后面还有相同的部分。这个问题可以通过计算字符串的next数组来解决,代码示例中展示了如何构建和使用next数组来找到满足条件的最大长度。
摘要由CSDN通过智能技术生成

传说在这片魔导大陆上有一位死神曾降下过神谕,如果谁能够解决其留下的这道问题,它就能保其永生!.给定一个长度为n的字符串S,试选择一段连续子串S[L~r],满足2<l<r<n且S[l~r]是字符串S的前缀,即S[L~r]与S[1~r-1+1]米相同。问能够选出的满足条件的连续子串的最长长度是多少?哦对,忘了说了,这片大陆现在是不死族的领地。

输入 仅一个由小写字母组成的字符串S。1<|S|< 500000。

输出 一个整数,表示最长长度。

样例输入1

ababa

样例输入2

abcde

样例输出1

3

样例输出2

0

题意:求出字符串最大的前缀,这个前缀在主串后面有和他相同的一段。

心得:一开始做这道题的时候题目看错了,直接误以为求最大前缀next的板子题,但实际上仔细一想这个思路是对的。(就是说无论那个相同的段在哪个地方,next都能遍历到)属于是瞎猫碰上死耗子了(哭哭)。

 

#include <bits/stdc++.h>
#define int long long
#define CIO std::ios::sync_with_stdio(false)
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define nep(i, r, l) for (int i = r; i >= l; i--)
using namespace std;
const int N=2e6+5;
char s[N];
int nxt[N];
int ma=-1;
void next(){
	int i=0,j=-1;
	nxt[0]=-1;
	while (i<strlen(s)){
		if (j==-1||s[i]==s[j]){
			i++;j++;
			nxt[i]=j;
			ma=max(j,ma);
		}
		else{
			j=nxt[j];
		}
	}
}
void work(){
	cin>>s;
	next();
	cout<<ma;
}
signed main(){
	CIO;
	work();
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值