题目描述

给定一个字符串 \(S\),我们规定一个字符串 \(P\) 是可行解,\(P\) 需要满足:

  1. \(P\) 是 \(S\) 的前缀
  2. \(P\) 是 \(S\) 的后缀
  3. \(P\) 出现在 \(S\) 中既不是前缀也不是后缀的地方

题目要求出满足条件的长度最大的 \(P\),若存在输出该字符串,若不存在则输出Just a legend

数据范围:\(1\leq |S|\leq 10^6\)


解题思路

我们可以发现一个切入点:

对于我们找到的一个满足条件的字符串 \(P\),(假设它在 \(S\) 中的起始和终点坐标分别为 \(l,r\))

那么我们发现(设 \(|S|=n\)):

  • \(P\) 既是 \(S[1...r]\) 的前缀,也是 \(S[1...r]\) 的后缀
  • \(P\) 既是 \(S[l...n]\) 的前缀,也是 \(S[l...n]\) 的后缀

有没有想到什么?没错!\(\text{KMP}\)

而且我们还可以发现上述性质就是 \(P\) 满足条件的充要条件!

所以我们只需要求出正反两个 \(next\) 数组,然后再枚举 \(l\) ,判断是否符合条件即可。

总的复杂度是 \(O(n)\) 的。


细节注意事项

  • 这题不要把 \(S\) 复制两次,我们可以用 reverse 函数将 \(S\) 反转(因为这题空间开得不大)
  • 注意字符串下标问题

参考代码

/*--------------------------------
--Author: The Ace Bee-------------
--Blog: www.cnblogs.com/zsbzsb----
--This code is made by The Ace Bee
--------------------------------*/
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#define rg register
#define clr(x, y) memset(x, y, sizeof x)
using namespace std; const int _ = 1000010; char s[_]; int p[2][_]; int main() {
scanf("%s", s + 1);
int n = strlen(s + 1);
p[0][1] = 0;
for (rg int j = 0, i = 1; i <= n; ++i) {
while (s[j + 1] != s[i + 1] && j) j = p[0][j];
if (s[j + 1] == s[i + 1]) ++j;
p[0][i + 1] = j;
}
reverse(s + 1, s + n + 1);
p[1][1] = 0;
for (rg int j = 0, i = 1; i <= n; ++i) {
while (s[j + 1] != s[i + 1] && j) j = p[1][j];
if (s[j + 1] == s[i + 1]) ++j;
p[1][i + 1] = j;
}
int pos = 0, mx = 0;
for (rg int i = 1; i <= n; ++i)
if (p[0][i] == p[1][n - i + p[0][i]])
if (mx < p[0][i]) mx = p[0][i], pos = i;
reverse(s + 1, s + n + 1);
if (pos == 0) puts("Just a legend");
else { for (rg int i = pos - mx + 1; i <= pos; ++i) putchar(s[i]); puts(""); }
return 0;
}

完结撒花 \(qwq\)

「CF126B」Password的更多相关文章

  1. 在Mac中使用「dd」指令烧录ISO镜像文件到U盘

    作者:超級efly   發布:2014-07-26 20:22   分類:電腦   閱讀:442   11條評論    大家在Windows系統下可以方便的使用UltraISO程式來燒錄「.ISO」, ...

  2. SpringBoot图文教程8 — SpringBoot集成MBG「代码生成器」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  3. 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式

    1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...

  4. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  5. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  6. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  7. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  8. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  9. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

随机推荐

  1. Mac系统中桌面图片和用户头像图片的路径

    系统中的桌面图片: /Library/Desktop Pictures/ 用户头像图片: 根目录资源库/user pictures/ 参考: [https://bbs.feng.com/read-ht ...

  2. 【代码学习】PYTHON 进程

    一.进程和程序的区别 编写完毕的代码,在没有运行的时候称之为程序 正在运行的代码,称之为进程 进程除了包含的代码意外,还需要运行的环境等 二.fork import os import time # ...

  3. Spring基础篇——通过Java注解和XML配置装配bean(转载)

      作者:陈本布衣 出处:http://www.cnblogs.com/chenbenbuyi 本文版权归作者和博客园共有,欢迎转载分享,但必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留 ...

  4. python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False。

    python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False. 重难点:定义函数的方法.使用str类型的find()函数,可以 ...

  5. 第八届极客大挑战 Web-故道白云&Clound的错误

    web-故道白云 题目: 解题思路: 0x01 首先看到题目说html里有秘密,就看了下源代码如图, 重点在红圈那里,表示输入的变量是id,当然上一行的method=“get”同时说明是get方式获取 ...

  6. C++基础之字符串string

    C++基础之字符串string 标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件.作为标准裤的一部分,string定义在命名空间std中. 定义和初始化s ...

  7. Windows server 2012 R2 服务器用户自动锁定

    开启共享文件夹后,发现经常会自动锁定导致,共享用户无法正常访问共享文件夹(原因不明) 解决办法,打开本地安全策略 把账户锁定阈值改为0

  8. 「NOI2001」食物链

    传送门 Luogu 解题思路 带权并查集我不会啊 考虑种类并查集(扩展域并查集的一种). 开三倍空间,一倍维护本身,二倍维护猎物,三倍维护天敌,然后用并查集搞一搞就好了. 细节注意事项 咕咕咕 参考代 ...

  9. Spring boot+Thymeleaf传参跳转

    $.ajax(): $.ajax({ type: "get", url:"/public/inform", async: true, data: detailJ ...

  10. 测试环境docker-swarm安装部署

    测试环境swarm安装部署 部署前增加监听docker2375端口 centos 增加tcp监听端口 修改/lib/systemd/system/docker.service sed -i ‘s/Ex ...