【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
fixprefixsuffixOutput
fixInput
abcdabcOutput
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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡申请通过了几天可以拿卡 银行不同时
- 下一篇: 【计蒜客 - 蓝桥训练】欧拉函数(数学,