Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //A
- #include <iostream>
- #include <cstdio>
- #include <set>
- #include <map>
- #include <algorithm>
- #include <vector>
- #include <queue>
- #include <stack>
- #include <cstring>
- #include <cassert>
- #include <cmath>
- #define forn(i,n) for(int i = 0; i < (int)(n);i++)
- #define forall(i,c) for(typeof((c).begin()) i = (c).begin(); i != (c).end();i++)
- #define forsn(i,s,n) for(int i = (int)(s); i < (int)(n);i++)
- #define all(v) (v).begin(),(v).end()
- #define isIn(i,c) ((c).find(i) != (c).end())
- #define SQR(x) ((x)*(x))
- typedef long long tint;
- using namespace std;
- const int MAXL = 1000100;
- int pmp[MAXL];
- void preMp(string& x){
- int i=0, j = pmp[0] = -1;
- while(i<(int)x.size()){
- while(j>-1 && x[i] != x[j]) j = pmp[j];
- pmp[++i] = ++j;
- }
- }
- string s;
- vector<int> prefs;
- int main(){
- #ifdef JUAMPI
- freopen("PASSWORD.in","r",stdin);
- freopen("PASSWORD.out","w",stderr);
- #endif
- getline(cin,s);
- preMp(s);
- int n = s.size();
- int k = pmp[n];
- /*forn(i,n) cout << pmp[i+1] << " ";
- cout << endl;
- */
- for(int i = pmp[n]; i >= 0; i--){
- if(k == i){
- prefs.push_back(i);
- k = pmp[i];
- }
- }
- prefs.pop_back();
- /*
- forn(i,prefs.size()){
- cout << "ONE: " << endl;
- forn(j, prefs[i])
- cout << s[j] << " ";
- cout << endl;
- }
- */
- sort(all(prefs));
- int l = -1, r = prefs.size();
- while(r - l > 1){
- int m = (l+r)/2;
- bool ok = false;
- forsn(i,1,n-1) if(pmp[i+1] == prefs[m]) ok = true;
- if(ok) l = m; else r = m;
- }
- // cout << l << " " << r << endl;
- if(l == -1) puts("Just a legend"); else{
- forn(i,prefs[l]) putchar(s[i]);
- putchar('\n');
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment