日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Codeforces - 127D】Password(思维,二分+字符串Hash)

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Codeforces - 127D】Password(思维,二分+字符串Hash) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題干:

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

?

總結

以上是生活随笔為你收集整理的【Codeforces - 127D】Password(思维,二分+字符串Hash)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。