• 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]='';    //直接将这个符合条件的前缀输出即可
        }
        if(fp)puts(str);
        else puts("Just a legend");
    }
  • 相关阅读:
    PY个树状数组
    PY 个板子计划【雾
    PY个欧拉筛
    【NOI2007】项链工厂 ——老题新做.jpg
    Min-Max 容斥的证明
    51nod 1963 树上Nim
    ●BZOJ 3566 [SHOI2014]概率充电器
    ●BZOJ 3640 JC的小苹果
    ●BZOJ 1444 [Jsoi2009]有趣的游戏
    ●Joyoi Dotp 驱逐猪猡
  • 原文地址:https://www.cnblogs.com/00isok/p/10731834.html
Copyright © 2020-2023  润新知