Codeforces Beta Round #93 (Div. 1 Only) B. Password KMP
链接:
http://codeforces.com/contest/126/problem/B
题意:
给你一个字符串,问是否存在一个子串出现在开头结尾和中间,找出最长的
题解:
构建Next数组,Next[i]表示以i为末尾的子串的后缀与能够匹配的整个串的最长的前缀。把除了Next[1]和Next[n]的都Hash一下
然后从x=Next[n]开始找,如果存在其他的Next[x]==Next[n],就说明除了开头和还存在其他的,如果不存在,x=Next[x],即缩小长度继续查找
代码:
31 char s[MAXN]; 32 int Next[MAXN]; 33 int Hash[MAXN]; 34 35 void buildNext(char P[]) { 36 int m = strlen(P); 37 int i = 0, j; 38 j = Next[0] = -1; 39 while (i < m) { 40 while (-1 != j && P[i] != P[j]) j = Next[j]; 41 Next[++i] = ++j; 42 } 43 } 44 45 int main() { 46 scanf("%s", s + 1); 47 buildNext(s + 1); 48 int n = strlen(s + 1); 49 rep(i, 2, n) Hash[Next[i]] = 1; 50 int x = Next[n]; 51 while (!Hash[x] && x) x = Next[x]; 52 if (!x) return puts("Just a legend"), 0; 53 rep(i, 1, x + 1) printf("%c", s[i]); 54 return 0; 55 }