CodeForces - 126B Password(kmp)

傳送門

求的是即是前綴,又是後綴,同時既不是前綴也不是後綴的子串。


nex[j]代表以j結尾的前綴與後綴匹配的最大長度,從最後一個字母開始,如果它的nex爲0,那麼肯定沒有滿足條件的子串,如果有的話,若nex[n] = x, 看看它之前有沒有nex也爲x的某個數i,如果有的話,1-x這一段前綴就是答案,如果沒有,可以繼續往前跳,讓x=nex[x],再重複上一步,可以重複的原因是,往前跳的話x一定是變小的,那麼之前的匹配也是滿足的。直到滿足條件或者x跳到最前面爲止。後者代表無解。


代碼:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1e6+10;
int nex[N],vis[N];
int n;
char a[N]; 
void get_next()
{
	for(int i=2,j=0;i<=n;i++)
	{
		while(a[i]!=a[j+1] && j)
			j=nex[j];
		if(a[i]==a[j+1]) j++;
		nex[i]=j;
	}
}
int main()
{
	scanf("%s",a+1);
	n=strlen(a+1);
	get_next();
	for(int i=1;i<n;i++)
		vis[nex[i]]=1;
	int ans=nex[n];
	while(ans)
	{
		if(vis[ans]) break;
		ans=nex[ans];
	}
	if(!ans)
		printf("Just a legend\n");
	else
	{
		for(int i=1;i<=ans;i++)
			printf("%c",a[i]);
		printf("\n");
	}
	
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章