【kmp算法】hdu4763 Theme Section

本文深入讲解了KMP算法中next数组的概念及应用,并提供了一段完整的C++代码示例,用于寻找字符串中最大相等的前后缀。

kmp中next数组的含义是:next[i]表示对于s[0]~s[i-1]这个前缀而言,最大相等的前后缀的长度是多少。规定next[0]=-1。

迭代for(int i=next[i];i!=-1;i=next[i]) 就可以得到某个前缀所有长度相等的前后缀的长度。

这题你就暴力枚举整个字符串的所有相等的前后缀,然后暴力判中间的部分是否存在即可。当然使用next数组会很简便。

#include<cstdio>
#include<cstring>
using namespace std;
int next[1000100],T,n;
char s[1000100];
void GetFail(char P[],int next[])//next[i]表示s[0]~s[i-1]的前缀中,最大相等的前后缀的长度是多少 
{
    next[0]=-1;
    int len=strlen(P);
    for(int i=0;i<len;i++)
      {
        int j=next[i];
        while(j>=0&&P[i]!=P[j])
		  j=next[j];
        if(j!=-1 && P[i]==P[j])
		  next[i+1]=j+1;
        else next[i+1]=0;
      }
    for(int i=0;i<len;++i)//左移一位形成最大长度表 
      next[i]=next[i+1];
}
int main()
{
//	freopen("c.in","r",stdin);
	scanf("%d",&T);
	for(;T;--T)
	  {
	  	scanf("%s",s);
	  	n=strlen(s);
	  	GetFail(s,next);
	  	int E=next[n-1];
	  	while(E)
	  	  {
	  	  	int k=n-E-1;
	  	  	while(next[k]<E && k>=2*E-1)
	  	  	  --k;
	  	  	if(k>=2*E-1)
	  	  	  {
	  	  	  	printf("%d\n",E);
	  	  	  	goto OUT;
	  	  	  }
	  	  	E=next[E-1];
	  	  }
	  	puts("0");
	  	OUT:;
	  }
	return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/6412094.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值