Codeforces 126B. Password (KMP)

<题目链接>

题目大意:
给定一个字符串,从中找出一个前、中、后缀最长公共子串("中"代表着既不是前缀,也不是后缀的部分)。

解题分析:
本题依然是利用了KMP中next数组的性质。具体做法见代码。

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6+5;

char str[N];
int vis[N],nxt[N];

void getNext(int len){
    int j=0,k=-1;
    nxt[0]=-1;
    while(j<len){
        if(k==-1||str[j]==str[k]){
            nxt[++j]=++k;
            if(j>=2 && j<len)vis[k]=1; //表示中部的字符串也存在这样一个最长公共的前缀后缀(因为这里控制了j>=2 && j < m)
        }else k=nxt[k];
    }
}
int main(){
    scanf("%s",str);int len=strlen(str);
    getNext(len);
    int sz=nxt[len];
    bool fp=false;
    if(sz){
        if(vis[sz])fp=true;
        else if(nxt[sz])sz=nxt[sz],fp=true;  //在原串的最长公共前、后缀子串中的前缀子串部分中再求一次最长公共前后缀子串,此时符合的情况也可作为答案
        str[sz]='\0';    //直接将这个符合条件的前缀输出即可
    }
    if(fp)puts(str);
    else puts("Just a legend");
}

猜你喜欢

转载自www.cnblogs.com/00isok/p/10731834.html