KMP CF126B Password
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的更多相关文章
- CF126B Password【KMP】By cellur925
题目传送门 其实$Chemist$在之前写了非常棒的题解! 我长话短说,补充两句. “那么当$next[n]$>$max$时显然不能将$next[n]$作为最长子串的长度”这句话其实在说,因为一 ...
- CF126B Password
思路: kmp略作修改. 实现: #include <iostream> #include <cstdio> using namespace std; ; int neXt[M ...
- CF126B password&&HDU 4763 Theme Section
http://acm.hdu.edu.cn/showproblem.php?pid=4763 http://codeforces.com/problemset/problem/126/B 这两个题都是 ...
- CF126B
CF126B Password 题意: 给出一个字符串 H,找一个最长的字符串 h,使得它既作为前缀出现过.又作为后缀出现过.还作为中间的子串出现过. 解法: 沿着 $ next_n $ 枚举字符串, ...
- 浅谈KMP算法——Chemist
很久以前就学过KMP,不过一直没有深入理解只是背代码,今天总结一下KMP算法来加深印象. 一.KMP算法介绍 KMP解决的问题:给你两个字符串A和B(|A|=n,|B|=m,n>m),询问一个字 ...
- 2021.08.30 前缀函数和KMP
2021.08.30 前缀函数和KMP KMP算法详解-彻底清楚了(转载+部分原创) - sofu6 - 博客园 (cnblogs.com) KMP算法next数组的一种理解思路 - 挠到头秃 - 博 ...
- Codeforces A. Password(KMP的nxt跳转表)
题目描述: Password time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- Codeforces 126B. Password(KMP,DP)
Codeforces 126B. Password 题意:一个字符串,找出最长的子串t,它既是前缀又是后缀,还出现在中间.输出t,不存在则输出Just a legend. 思路:利用KMP算法处理出n ...
- Codeforces126B - Password(KMP)
题目大意 给定一个字符串S,要求你找到一个最长的子串,它既是S的前缀,也是S的后缀,并且在S的内部也出现过(非端点) 题解 KMP的失配函数f[i]的非零值就是前i个字符的一个最长前缀且也是后缀的字符 ...
随机推荐
- 《数据结构》C++代码 堆(优先队列)
堆,是优先队列最常用的一种实现方式.在优先队列中,每个元素都被赋予了一个优先级,而每次出队时都让优先级最高的元素出队.堆,则是一种存储优先队列的方法,特指以一棵树形式存储的优先队列.最常用的是二叉堆, ...
- Python运算符及逻辑运算
基本运算符 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是“+”.在计算器语言中运算符大致可以分为5种类型:算术运算符.连接运算符.关系运 ...
- hp raid json
hp机器均已在装OS之前划好raid,统一规格为2*480G SSD, 12*4T SATA ,2*1.6T SSD,其中2*480G SSD做系统盘,划分raid1 已知disk controlle ...
- Axios & fetch api & Promise & POST
Axios & fetch api & Promise & POST https://github.com/axios/axios https://appdividend.co ...
- HDU 4585 Shaolin(Treap找前驱和后继)
Shaolin Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Su ...
- [CF463D]Gargari and Permutations
题目大意:给你$k(2\leqslant k\leqslant5)$个$1\sim n(n\leqslant10^3)$的排列,求它们的最长子序列 题解:将$k$个排列中每个元素的位置记录下来.如果是 ...
- POJ 2318 TOYS | 二分+判断点在多边形内
题意: 给一个矩形的区域(左上角为(x1,y1) 右下角为(x2,y2)),给出n对(u,v)表示(u,y1) 和 (v,y2)构成线段将矩形切割 这样构成了n+1个多边形,再给出m个点,问每个多边形 ...
- BZOJ2594 [Wc2006]水管局长数据加强版 【LCT维护最小生成树】
题目 SC省MY市有着庞大的地下水管网络,嘟嘟是MY市的水管局长(就是管水管的啦),嘟嘟作为水管局长的工作就是:每天供水公司可能要将一定量的水从x处送往y处,嘟嘟需要为供水公司找到一条从A至B的水管的 ...
- 枪战(maf)
枪战(maf) settle the dispute. Negotiations were very tense, and at one point the trigger-happy partici ...
- 基站选址(base.c/cpp/pas)
基站选址(base.c/cpp/pas) 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费 ...