「CF126B」Password
题目描述
给定一个字符串 \(S\),我们规定一个字符串 \(P\) 是可行解,\(P\) 需要满足:
- \(P\) 是 \(S\) 的前缀
- \(P\) 是 \(S\) 的后缀
- \(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的更多相关文章
- 在Mac中使用「dd」指令烧录ISO镜像文件到U盘
作者:超級efly 發布:2014-07-26 20:22 分類:電腦 閱讀:442 11條評論 大家在Windows系統下可以方便的使用UltraISO程式來燒錄「.ISO」, ...
- SpringBoot图文教程8 — SpringBoot集成MBG「代码生成器」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...
- 「补课」进行时:设计模式(5)——从 LOL 中学习代理模式
1. 前文汇总 「补课」进行时:设计模式系列 2. 从 LOL 中学习代理模式 我是一个很喜欢玩游戏的人,虽然平时玩游戏的时间并不多,但我也是一个忠实的 LOL 的爱好者,就是段位有点惨不忍睹,常年倔 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
随机推荐
- 如何让DOS命令在新窗口打开
可以调用别外的批处理如 start a.batstart b.batstart c.bat 新建a.bat.B.BAT.C.CAT,在这几个批处理中输入你的命令. 以上我自己测试通过.
- memcache安装 基于Red Hat 7.4
Linux版本为 Red Hat 7.4 一.安装 1.下载:http://memcached.org/downloads 解压: tar -xzvf memcached-1.5.3.tar.gz 得 ...
- vscode设置python代码补全时函数自动加上小括号
vscode设置python代码补全时函数自动加上小括号 vscode的python代码补全插件默认安装时是不会自动补全括号的,感觉不是和方便 以下介绍下自动补上小括号的方法 可能部分同学设置了还是没 ...
- AngularJS Learning Notes
AngularJS 简介 AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 指令 扩展了 HTML ...
- JavaScript 对象的深复制
对象的深复制 源对象的属性更改,不会引起复制后的对象个属性的更改 源对象的任何属性与子属性与新对象的之间没有任何引用关系 Coding: /* 对象的深复制: 1 初始化目标对象 如果没有指定目标对象 ...
- 树莓派安装raspbian并配置开发环境
1.烧录系统 首先准备好我们要烧录的raspbian系统,可以在树莓派官网中下载https://www.raspberrypi.org/downloads/ 这里我们选择 2018-11-13-ras ...
- Go标准库之Log
文章引用自 Go语言标准库log介绍 无论是软件开发的调试阶段还是软件上线之后的运行阶段,日志一直都是非常重要的一个环节,我们也应该养成在程序中记录日志的好习惯. log Go语言内置的log包实 ...
- 关于iOS appIcon launchImage 尺寸
https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/MobileHIG/IconMatrix ...
- Java工作流引擎关于数据加密流程(MD5数据加密防篡改)
关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 开发者表单 拖拽式表单 工作流系统 流程数据加密 md5 数据保密流程数据防篡改 ...
- PHP将json或对象转成数组
今天老大突然给了我一个小任务,给我一个txt文件,里边是很多的json字串,要求将这些字串转换成php中的数组: 于是开足火力,用了将进5分钟的时间完成了任务,代码如下: $jsonStr = fil ...