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 }

 

posted @ 2017-09-13 16:29  Flowersea  阅读(202)  评论(0编辑  收藏  举报