<题目链接>
题目大意:
给定一个字符串,从中找出一个前、中、后缀最长公共子串("中"代表着既不是前缀,也不是后缀的部分)。
解题分析:
本题依然是利用了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"); }
原文地址:https://www.cnblogs.com/00isok/p/10731834.html
时间: 2024-10-28 05:29:22