<题目链接>

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

解题分析:
本题依然是利用了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");
}

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄