码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 126B. Password (KMP)

时间:2019-04-18 20:17:27      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:size   tar   while   puts   name   ref   next   can   char   

<题目链接>

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

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

 

Codeforces 126B. Password (KMP)

标签:size   tar   while   puts   name   ref   next   can   char   

原文地址:https://www.cnblogs.com/00isok/p/10731834.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!