B. Password Codeforces Beta Round 93 (Div. 1 Only)

发布于:2024-04-07 ⋅ 阅读:(126) ⋅ 点赞:(0)

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

题目大意:

在一个字符串里找一个子串,它在头,尾,中间都出现一次。

思路:

遍历一遍字符串与头部子串进行匹配。

方法:

跑单for进行匹配,把最后的子串标记为不可取。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"

const ll N = 1e6+7;
ll dp[N];
bool vis[N];
string s;

void solve(){
	cin >> s;
	ll len=s.size(),cnt=0;
	for(ll i = 1 ; i < len ; i ++){
		//如果当前的字母不匹配了,往前匹配 
		while(cnt && s[i] != s[cnt])cnt=dp[cnt-1];
		//如果当前字符匹配,长度++ 
		if(s[i] == s[cnt])cnt++;
		//末尾与头相等的字符串不进行匹配 
		if(i < len-1)vis[cnt]=1;
		//记录此点可取子串的长度 
		dp[i]=cnt;
	}
	vis[0]=1,cnt=dp[len-1];
	//除去末尾与头相等的部分 
	while(cnt && !vis[cnt])cnt=dp[cnt-1];
	cnt > 0 ? cout << s.substr(0,cnt) << endl : cout << "Just a legend" << endl;
	return;
}

int main() {
	ll t=1;//cin >> t;
	while(t--)solve();
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到