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

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;
}

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值