`
king_tt
  • 浏览: 2189633 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

CF 126B Password (KMP,利用next数组)

 
阅读更多

链接:

http://www.codeforces.com/problemset/problem/126/B


题目大意:

给定一个字符串S, 找到一个子串t,使得这个子串既和S的前缀相同,又和S的后缀相同,但是t不能是S的前缀或后缀。


分析与总结:

利用和理解next数组的好题,首先可以找到所有与前缀相同的后缀的长度, 另len=|S|, 那么next[len] 就是最长的与前缀相同的后缀。

然后利用next数组,可以求出所有长度的后缀与前缀相同的长度,用一个vis数组标记。

之后只需要遍历一遍next数组(非开头与结尾),找到最长的长度即可。



代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

const int MAXN = 1000005;
char S[MAXN];
int  f[MAXN];
bool vis[MAXN];

void getNext(char* p,int* f){
    int m=strlen(p);
    f[0]=f[1]=0;
    for(int i=1; i<m; ++i){
        int j=f[i];
        while(j && p[i]!=p[j]) j=f[j];
        f[i+1] = p[i]==p[j]?1+j:0;
    }
}

int main(){
    while(scanf("%s",S)!=EOF){
        getNext(S,f);

        int len=strlen(S);
        int maxx=f[len];

        if(maxx==0){
            puts("Just a legend");
            continue;
        } 

        memset(vis, 0, sizeof(vis));
        vis[maxx]=true;
        int j=maxx;
        while(j){
            vis[f[j]]=true; // 把所有同时是前缀和后缀的长度标记
            j=f[j];
        }

        bool ok=false;
        int  ans=0,pos=0;
        for(int i=2; i<len; ++i){
            if(vis[f[i]] && f[i]>ans){
                ok=true;
                ans=f[i];
            }
        }
        if(!ok){
            puts("Just a legend");
        }
        else{
            puts(S+len-ans);
        }
    }
    return 0;
}



—— 生命的意义,在于赋予它意义士。

原创http://blog.csdn.net/shuangde800By D_Double (转载请标明)



分享到:
评论

相关推荐

    数据结构KMP-NEXT数组计算方法

    ### 数据结构KMP-NEXT数组计算方法 #### KMP算法简介 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法...掌握了NEXT数组的计算方法后,便可以进一步了解如何利用NEXT数组进行字符串匹配,进而提高匹配效率。

    数据结构 KMP算法及next数组求解过程

    该算法的核心在于利用了预处理得到的next数组,这个数组记录了模式串中每个字符后可能跟的最长公共前后缀的长度。下面我们将深入探讨KMP算法及其next数组的求解过程。 首先,我们需要理解KMP算法的基本思想。传统的...

    KMP算法中next数组的计算方法研究

    ### KMP算法中next数组的计算方法研究 #### 摘要 KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,在文本处理领域有着广泛的应用。其核心在于通过预处理模式串(待查找的字符串),计算出一个名为`...

    KMP求next数组中的图片

    本文将深入探讨KMP算法以及其中的"next"数组,同时结合提供的图片资源进行详细解释。 首先,KMP算法是由Donald Knuth、Vaughan Pratt和James Morris三位学者共同提出的。它的核心在于构建一个"next"数组,也称为...

    汇编语言实现kmp(next数组升级)

    汇编语言实现kmp(next数组升级)

    KMP算法的next数组

    关于字符串匹配里,KMP算法中next实现实现原理。关于字符串匹配里,KMP算法中next实现实现原理。

    kmp的next数组算法.zip

    KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度 也就是说,KMP算法是...

    KMP算法中next数组求法.docx

    KMP算法中next数组求法 KMP算法是字符串匹配算法中的一种高效算法,next数组是KMP算法的核心结构。next数组的计算是KMP算法的关键步骤,本文将详细介绍next数组的计算方法。 next数组的定义: next数组的定义为:...

    算法总结kmp、树状数组等

    KMP算法的思想是,通过计算模式串的next数组,来记录模式串中的每个字符所对应的匹配位置。next数组的计算方法是,从头开始,寻找当前位置至开始判断两边的字符重复的个数记录入当前位置的next数组中。 例如,模式...

    KMP-fail.rar_kmp fail_kmp的fail_kmp算法fail数组_kmp算法求fail

    在KMP算法中,关键的概念是fail数组,也被称为next数组,它存储了模式串的前缀和后缀的最长公共长度,用于指导匹配过程。 fail数组的计算是KMP算法的核心部分,其主要目的是为了构建一个动态跳转表,使得在主串和...

    【课件】4.2.2_2_求next数组.pdf

    通过这种方式,我们能够有效地构建出next数组,进而利用该数组来优化KMP算法中的字符串匹配过程。具体来说,在进行主串和模式串的匹配时,如果出现不匹配的情况,则可以根据next数组的值直接跳过部分不必要的比较,...

    4.2_3_求next数组 (2)1

    next数组记录了模式串中每个位置上的最大前缀后缀长度,也就是说,当模式串的某个位置与主串(即待匹配的字符串)比较时发生不匹配,可以利用next数组确定模式串应该回退多少位继续匹配,而无需从头开始。...

    KMP算法中求NEXT的方法

    KMP算法中求NEXT的方法,希望对大家有所帮助啊,呵呵!!!

    KMP算法,一个Next数组,一个NextVal数组.zip

    KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度 也就是说,KMP算法是...

    实例模拟KMP算法的next失配函数

    KMP算法的核心在于构造一个next数组,也称为失配函数,它存储了模式串中的每个字符与前缀的最长公共后缀长度。这个数组在算法执行过程中起着关键作用,避免了不必要的字符比较,提高了搜索效率。 在KMP算法中,next...

    扩展 KMP 算法(转载)

    计算 next 数组的代码使用了 KMP 算法的思想,计算 extend 数组的代码使用了 next 数组和字符串 S 的信息。 时间复杂度 扩展 KMP 算法的时间复杂度为 O(n+m),其中 n 和 m 分别是字符串 S 和 T 的长度。 空间...

    KMP算法源代码、Z-BOX算法源代码

    KMP算法避免了在匹配过程中不必要的字符比较,通过构建一个“部分匹配表”(也称为“next数组”),能够快速跳过已知不匹配的部分,从而提高搜索效率。在本压缩包中,包含两个关键文件:`z_box2kmp_next`和`KMP`,...

    kMP算法JavakMP算法JavakMP算法JavakMP算法Java

    KMP(Knuth-Morris-Pratt)算法是一种在...在Java中,我们可以利用类`KMP`实现该算法,通过预处理next数组并用它来指导匹配过程。在实际应用中,KMP算法常用于大量字符串的搜索和匹配,如文本编辑器、搜索引擎等场景。

    模拟KMP失配函数next过程分析

    总结来说,KMP算法及其失配函数next是解决字符串匹配问题的有效工具,其核心思想是利用已知的匹配信息来优化搜索过程,避免不必要的回溯。理解和模拟next过程对于深入掌握KMP算法至关重要,这有助于我们编写出更高效...

Global site tag (gtag.js) - Google Analytics