CodeForces - 126B Password

Posted awhitewall

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 126B Password相关的知识,希望对你有一定的参考价值。

考虑使用(kmp)(nxt)数组。我们先枚举(i)(除了(1)(n)),将其对应的(nxt)打上标记,这样就意味着我们确定了条件中的前缀和中间的串。

我们再考虑后缀。可以从(n)开始,用(nxt)一个一个地跳。因为(nxt)本身就保证末尾至少相同。而每个(nxt)都保证是最长的,故正确。

#include<cstdio>
#include<cstdlib>
#include<cstring>

const int N = 1000010;

int n, nxt[N];
bool vis[N];
char s[N];

int read() {
    int x = 0, f = 1; char s;
    while((s = getchar()) > '9' || s < '0') {
        if(s == '-') f = -1;
        if(s == EOF) exit(0);
    }
    while(s >= '0' && s <= '9') {
        x = (x << 1) + (x << 3) + (s ^ 48);
        s = getchar();
    }
    return x * f;
}

void init() {
    int j = 0;
    for(int i = 2; i <= n; ++ i) {
        while(j && s[i] != s[j + 1]) j = nxt[j];
        if(s[i] == s[j + 1]) ++ j;
        nxt[i] = j;
    }
}

int main() {
    scanf("%s", s + 1); n = strlen(s + 1);
    init();
    for(int i = 2; i < n; ++ i) vis[nxt[i]] = 1;
    vis[0] = 0;
    for(int i = n; i; i = nxt[i])
        if(vis[nxt[i]]) {
            for(int j = 1; j <= nxt[i]; ++ j) putchar(s[j]);
            putchar('
'); return 0;
        }
    puts("Just a legend");
    return 0;
}

以上是关于CodeForces - 126B Password的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 126B(kmp)

CodeForces - 126B Password

CF126B Password

CF 126B KMP/Z_match

CF126B PasswordKMPBy cellur925

126B Password[扩展kmp学习]