其他分享
首页 > 其他分享> > 一本通 Seek the Name, Seek the Fame(KMP)

一本通 Seek the Name, Seek the Fame(KMP)

作者:互联网

题意:给你一个字符串s,输出该字符串的所有的前后缀长度

思路:利用next数组,next[i]是子串长为i的最大公共前后缀,

所以 next[next[i]] 意味着 在最大公共前后缀 的子串里再去寻找最大公共前后缀子串


#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=1e6+10;
int nextt[maxn],l1;
char s[maxn];
int ans[maxn];
void getnext()//纯粹的建立next数组 
{
	int j=-1,i=0;
	nextt[0]=-1;
	while(i<l1)
	{
		if (j==-1||s[i]==s[j])
		{
			i++,j++;
			nextt[i]=j;
			//printf("<%d %d\n",i,j);
		}
		else
		{
			//printf("%d %d>\n",j,nextt[j]);
			j=nextt[j];
		}
	}
}
int main()
{
	int i,j,n;
	while(~scanf("%s",s))
	{
		l1=strlen(s);
		getnext();

		int k=0;
		i=l1;
		//凡是next[i]!=0的,都是模式串的前缀和后缀相同的字符数
		while (nextt[i]!=-1) 
		{
			ans[k++]=i;
			i=nextt[i];//
		}
		for (i=k-1; i>=0; i--)
			printf("%d ",ans[i]);
		
		printf("\n");
	}
	return 0;
}

`

标签:Name,int,next,nextt,后缀,maxn,KMP,include,Seek
来源: https://www.cnblogs.com/shidianshixuan/p/13922478.html