CSU-ACM2017暑期训练12-KMP F - 前缀后缀
2017-08-08 22:07
555 查看
F - 前缀后缀
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.
Example
Input fixprefixsuffix Output fix Input abcdabc Output Just a legend
#include <iostream> #include <cstdio> #include <algorithm> #include <vector> #include <cstring> #include <queue> using namespace std; const int maxn = 1e6 + 10; char s[maxn], sample[maxn]; int Next[maxn], anotherNext[maxn]; bool vis[maxn]; void getNext(int nex[], char str[]){ int len = strlen(str); nex[0] = nex[1] = 0; int j; for(int i = 1; i < len; i++){ j = nex[i]; while(j && s[i] != s[j]) j = nex[j]; if(s[i] == s[j]) nex[i + 1] = j + 1; else nex[i + 1] = 0; } } bool check(){ int len = strlen(s); for(int i = 0; i < len; i++) vis[Next[i]] = true; int k = len; while(Next[k] != 0){ // 非常巧妙之处。 if(vis[Next[k]]){ for(int j = 0; j < Next[k]; j++) putchar(s[j]); putchar('\n'); return true; } k = Next[k]; } return false; } int main(){ #ifdef TEST freopen("test.txt", "r", stdin); #endif // TEST while(scanf("%s", s) != EOF){ memset(Next, 0, sizeof(Next)); memset(vis, false, sizeof(vis)); int len = strlen(s); getNext(Next, s); if(!check()) printf("Just a legend\n"); } return 0; }
相关文章推荐
- CSU-ACM2017暑期训练12-KMP D - 匹配
- CSU-ACM2017暑期训练12-KMP E - 循环
- CSU-ACM2017暑期训练12-KMP H - 结合dp
- CSU-ACM2017暑期训练12-KMP G - Next[]树 CodeForces - 432D
- CSU-ACM2017暑期训练1-Debug与STL E - Train Problem I
- CSU-ACM2017暑期训练1-Debug与STL hdu2736 - Surprising Strings
- CSU-ACM2017暑期训练7-模拟&&贪心 A - Radar Installation POJ - 1328
- CSU-ACM2017暑期训练7-模拟&&贪心 F - Sokoban
- CSU-ACM2017暑期训练1-Debug与STL Jury Marks-set判重
- CSU-ACM2017暑期训练1-Debug与STL A - Surprising Strings
- CSU-ACM2017暑期训练6-bfs I - The Labyrinth CodeForces - 616C
- CSU-ACM2017暑期训练1-Debug与STL C-Languages-map判重
- CSU-ACM2017暑期训练1-Debug与STL C - Languages
- CSU-ACM2017暑期训练3 J - Non-boring sequences UVA - 1608
- CSU-ACM2017暑期训练4-dfs D - 单源最大权路径 CSU - 1960
- CSU-ACM2017暑期训练5-三分 E - Line belt HDU - 3400
- CSU-ACM2017暑期训练10-并查集&&HASH A-Virtual Friends HDU - 3172
- Function Run Fun--CSU-ACM2017暑期训练3-递推与递归
- CSU-ACM2017暑期训练4-dfs E - The Settlers of Catan POJ - 2258
- CSU-ACM2017暑期训练5-三分 E - Line belt