Description

Asterix,Obelix和他们的临时伙伴Suffix、Prefix已经最终找到了和谐寺。然而和谐寺大门紧闭,就连Obelix的运气也没好到能打开它。

不久他们发现了一个字符串S(|S|<=1000000),刻在和谐寺大门下面的岩石上。Asterix猜想那一定是打开寺庙大门的密码,于是就大声将字符串朗读了出来,然而并没有什么事发生。于是Asterix又猜想密码一定是字符串S的子串T。

Prefix认为T是S的前缀,Suffix认为T是S的后缀,Obelix却认为T应该是S中的某一部分,也就是说,T既不是S的前缀,也不是S的后缀。

Asterix选择子串T来满足所有伙伴们的想法。同时,在所有可以被接受的子串变形中,Asterix选择了最长的一个(因为Asterix喜欢长的字符串)当Asterix大声读出子串T时,寺庙的大门开了。 (也就是说,你需要找到既是S的前缀又是S的后缀同时又在S中间出现过的最长子串)

现在给你字符串S,你需要找到满足上述要求的子串T。

Input

一个长度在[1,1000000]间的只包含小写字母的字符串S。

Output

输出子串T,如果T不存在,输出 "Just a legend",不包含引号。

一句话题意

求一个给定串\(s\)的一个子串\(T\).

满足

  • \(T\)是\(s\)的前缀
  • \(T\)是\(s\)的后缀
  • \(T\)在\(s\)中间出现过

xjb分析

首先明确我们要找的是这种情况.

此时,我们发现,蓝色部分好像是什么东西?

\(KMP\)算法中的\(next\)! (最长公共前后缀的长度

现在明确了我们的解题方法,\(KMP\)

那么现在的问题就是要找图中红色部分.

如何去找红色部分?

我们发现,可以将图片看成这样.

这样又成了\(KMP\)算法中的\(next\)

那么现在我们需要知道最长的长度.

显然,中间部分的长度可能比\(s\)的前缀或后缀长亦可能短,但是长度最大只可能是\(next[n]\).

即真实答案\(ans \leq next[n]\)

所以我们需要在$2 \(到\)n-1\(中找到第一个比\)next[n]$小的位置。

而,我们需要记录一下\(mxx=\sum_{i=2}^{n-1}next_i\)

有什么用?

考虑一下我们的中间部分的子串长度只可能是\(\leq next[n]\)的,因此我们要一直跳转\(next[n]\)知道某个位置小于等于中间部分最长子串的长度.

这个时候问题得以解决.

判断无解的话只需要判断跳转到的\(next\)是否为\(0\)输出\(Just\ a\ legend\)即可。

最后只需要枚举\(i\)从\(2\)到\(n-1\)去找那个\(next[i]\)即可.

然后直接输出即可.

代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define R register
using namespace std;
char s[1000080];
int len,nex[1000080],k,mxx,now;
inline void judge()
{
if(!now)
{
puts("Just a legend");
exit(0);
}
}
int main()
{
scanf("%s",s+1);
len=strlen(s+1);nex[1]=0;
for(R int i=2;i<=len;i++)
{
while(k and s[k+1]!=s[i])k=nex[k];
if(s[i]==s[k+1])k++;
nex[i]=k;
if(i!=len)mxx=max(nex[i],mxx);
}
now=nex[len];
judge();while(now>mxx)now=nex[now];judge();
for(R int i=2;i<len;i++)
if(now==nex[i])
{
for(R int j=i-now+1;j<=i;j++)
printf("%c",s[j]);
exit(0);
}
}

KMP CF126B Password的更多相关文章

  1. CF126B Password【KMP】By cellur925

    题目传送门 其实$Chemist$在之前写了非常棒的题解! 我长话短说,补充两句. “那么当$next[n]$>$max$时显然不能将$next[n]$作为最长子串的长度”这句话其实在说,因为一 ...

  2. CF126B Password

    思路: kmp略作修改. 实现: #include <iostream> #include <cstdio> using namespace std; ; int neXt[M ...

  3. CF126B password&&HDU 4763 Theme Section

    http://acm.hdu.edu.cn/showproblem.php?pid=4763 http://codeforces.com/problemset/problem/126/B 这两个题都是 ...

  4. CF126B

    CF126B Password 题意: 给出一个字符串 H,找一个最长的字符串 h,使得它既作为前缀出现过.又作为后缀出现过.还作为中间的子串出现过. 解法: 沿着 $ next_n $ 枚举字符串, ...

  5. 浅谈KMP算法——Chemist

    很久以前就学过KMP,不过一直没有深入理解只是背代码,今天总结一下KMP算法来加深印象. 一.KMP算法介绍 KMP解决的问题:给你两个字符串A和B(|A|=n,|B|=m,n>m),询问一个字 ...

  6. 2021.08.30 前缀函数和KMP

    2021.08.30 前缀函数和KMP KMP算法详解-彻底清楚了(转载+部分原创) - sofu6 - 博客园 (cnblogs.com) KMP算法next数组的一种理解思路 - 挠到头秃 - 博 ...

  7. Codeforces A. Password(KMP的nxt跳转表)

    题目描述: Password time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  8. Codeforces 126B. Password(KMP,DP)

    Codeforces 126B. Password 题意:一个字符串,找出最长的子串t,它既是前缀又是后缀,还出现在中间.输出t,不存在则输出Just a legend. 思路:利用KMP算法处理出n ...

  9. Codeforces126B - Password(KMP)

    题目大意 给定一个字符串S,要求你找到一个最长的子串,它既是S的前缀,也是S的后缀,并且在S的内部也出现过(非端点) 题解 KMP的失配函数f[i]的非零值就是前i个字符的一个最长前缀且也是后缀的字符 ...

随机推荐

  1. Windows Phone 图片扩展类

    using System.IO; using System.Text; using System.Net; using System.Threading.Tasks; using System.Win ...

  2. 【Spiral Matrix】cpp

    题目: Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spira ...

  3. Git上手:四种常见的Git协同工作方式

    1.集中式工作流 适用人群:开发小团队(4-5人),习惯使用SVN工具的小团队. 工作方式:团队组长创建远程仓库,创建一个master分支,组员可读可写. 每个开发人员都git clone远程仓库到本 ...

  4. 孤荷凌寒自学python第十七天初识Python的函数

    孤荷凌寒自学python第十七天初识Python的函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 函数是能够完成指定运算并返回运算结果的代码块.是结构化编程重要的结构. 我首先发现pyt ...

  5. 实验 使用 vivado zedboard GPIO 开关 开控制 LED

    前面我做了几个实验 都没有用过 开关,这一次用一用 发现 vivado 真的挺方便 所以 使用 vivado 开发 1.建工程 我使用 vivado 2013.4 创建新工程 –> next – ...

  6. iPhone新建项目不能全屏

    上个周做项目的时候,发现新建了一个项目不能全屏.伤透了我的脑筋,然后又请教了团队里其他两个大牛帮我搞定了这个问题. 虽然是搞定了,但也看的出大牛也是云里雾里.歪打正着解决的. 今天又想新做个项目,这个 ...

  7. ubuntu16.04 使用问题笔记

    1.问题: 下列软件包有未满足的依赖关系: vim : 依赖: vim-common (= 2:7.4.826-1ubuntu1) 但是 2:7.4.1689-3ubuntu1 正要被安装 E: 无法 ...

  8. JVM垃圾回收机制GC

    1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象:而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾.JVM的 ...

  9. Python中的多线程编程,线程安全与锁(一)

    1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ...

  10. 多线程 线程组 ThreadGroup

    package org.zln.thread; import java.util.Date; /** * Created by sherry on 000024/6/24 22:30. */ publ ...