Codeforces B. Password (KMP)

版权声明:转载请标明出处 https://blog.csdn.net/weixin_41190227/article/details/86513980

B. Password

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

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

Copy

fixprefixsuffix

output

Copy

fix

input

Copy

abcdabc

output

Copy

Just a legend、

题目大意: 在一个字符串s中找一个子串,这个子串要符合的条件有三点,第一可以说这个子串是s的前缀,第二也可以说这个子串是s的后缀,第三也可以说这个子串既不是s的前缀也不是s的后缀。

解题思路:运用到KMP中的Next数组,因为这个数组的含义是可以直接得到某个点之前的相同前后缀的长度是多少。

/*
@Author: Top_Spirit
@Language: C++
*/
#include <bits/stdc++.h>
using namespace std ;
typedef unsigned long long ull ;
typedef long long ll ;
const int Maxn = 1e6 + 10 ;

string s ;
int len, Next[Maxn] ;
int cnt[Maxn] ;

void Get_Next(){
    Next[0] = -1 ;
    int k = -1, j = 0 ;
    while (j < len){
        if (k == -1 || s[j] == s[k]) Next[++j] = ++k ;
        else k = Next[k] ;
    }
}

int main (){
    cin >> s;
    len = s.size() ;
    Get_Next() ;
    for (int i = 1; i <= len; i++) cnt[i] = 1 ;
    for (int i = len; i >= 1; i--) cnt[Next[i]] += cnt[i] ;
    int tmp = len ;
    while (tmp){
        if (cnt[tmp] >= 3){
            cout << s.substr(0, tmp) ;
            return 0 ;
        }
        tmp = Next[tmp] ;
    }
    cout << "Just a legend" << endl ;
    return 0 ;
}

如果结果不如你所愿

那就在尘埃落定前奋力一搏

猜你喜欢

转载自blog.csdn.net/weixin_41190227/article/details/86513980