题干:
Asterix, Obelix and their temporary buddies Suffix and Prefix has finally found the Harmony temple. However, its doors were firmly locked and even Obelix had no luck opening them.
A little later they found a string s, carved on a rock below the temple's gates. Asterix supposed that that's the password that opens the temple and read the string aloud. However, nothing happened. Then Asterix supposed that a password is some substring t of the string s.
Prefix supposed that the substring t is the beginning of the string s; Suffix supposed that the substring t should be the end of the string s; and Obelix supposed that t should be located somewhere inside the string s, that is, t is neither its beginning, nor its end.
Asterix chose the substring t so as to please all his companions. Besides, from all acceptable variants Asterix chose the longest one (as Asterix loves long strings). When Asterix read the substring t aloud, the temple doors opened.
You know the string s. Find the substring t or determine that such substring does not exist and all that's been written above is just a nice legend.
Input
You are given the string s whose length can vary from 1 to 106 (inclusive), consisting of small Latin letters.
Output
Print the string t. If a suitable t string does not exist, then print "Just a legend" without the quotes.
Examples
Input
fixprefixsuffix
Output
fix
Input
abcdabc
Output
Just a legend
题目大意:
从一个串s中找出一个最长的子串t,该字串满足:
t是s的前缀,t是s的后缀,t是s的中缀,(定义t是s的中缀:t串在s串中出现,且既不是前缀也不是后缀)
(|s|<=1e6)
解题报告:
这题正解好像是exkmp。。但是也比较巧妙的是字符串Hash的做法。
首先我们知道,如果题目让求的是前缀和中缀,那直接二分+Hash即可。现在加上了后缀,貌似就不能直接二分+Hash了,因为当对于一个长度k满足,不一定对于k'也满足(其中k'<k),比如abcdabcdabcd,abcd是答案,但是ab就不是答案,因为ab不是后缀。对于这种情况的一个处理就是:先On预处理出来所有的可行前缀后缀,然后再预处理的数组中去二分。也就是先用后缀来约束一部分前缀,使得目前可行前缀都是满足前缀==后缀的,所以只需要判断前缀和中缀的关系就可以了。
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pair<int,int> PII;
typedef unsigned ll ull;
const int MAX = 1e6 + 5;
const ull seed = 131;
ull Hash[MAX],P[MAX];
char s[MAX];
int n;
ull get(int l,int r) {return Hash[r]-Hash[l-1]*P[r-l+1];
}
int b[MAX],tot;
bool ok(int x) {ull tar = get(1,x);for(int l = 2; l+x-1<n; l++) {int r = l+x-1;if(tar == get(l,r)) return 1;}return 0;
}
int main()
{cin>>s+1;n = strlen(s+1);P[0]=1;for(int i = 1; i<=n; i++) P[i] = P[i-1]*seed;for(int i = 1; i<=n; i++) {Hash[i] = Hash[i-1]*seed + s[i]-'a'+1;}for(int i = 1; i<=n; i++) {if(get(1,i) == get(n-i+1,n)) b[++tot] = i;}int l=1,r=tot,ans=-1,mid;while(l<=r) {mid = (l+r)>>1;if(ok(b[mid])) l = mid+1,ans = b[mid];else r = mid-1;}if(ans == -1) {printf("Just a legend\n");return 0;}for(int i = 1; i<=ans; i++) printf("%c",s[i]);return 0 ;
}