zoukankan      html  css  js  c++  java
  • 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");
    }
  • 相关阅读:
    Serveral effective linux commands
    Amber learning note A8: Loop Dynamics of the HIV-1 Integrase Core Domain
    amber初学……
    anaconda使用
    python中的一些语法
    python中的OOP
    python中的模块
    将python程序打包成exe
    python-执行过程
    python基础
  • 原文地址:https://www.cnblogs.com/00isok/p/10731834.html
Copyright © 2011-2022 走看看