「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),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
随机推荐
- 用vscode写c/c++
用vscode写c/c++ 1. 安装wsl windows下安装linux(ubuntu) 2. 打开设置 3. 输入run code 随便找一个地方粘贴,会出现一大段代码 4. 把c对应的代码修改 ...
- Cygwin不能编译及解决办法
最近不知道什么原因,以前使用cygwin编译Android动态库,现在不能使用了,报下面的错误. Android NDK: Host 'awk' tool is outdated. Please de ...
- Jmeter_JsonPath 提取器
1.登录老黄历 2.提取阳历的数据,不用正则表达式提取器,因为这里是字典形式,用Json path提取器更简单 3.把提取的数据放到百度里去发送请求 4. 5. 6. 7. 8. 9.
- [数据库] MariaDB安装及使用
一.安装MariaDB 1.使用官方源安装marisdb 如果使用阿里云的源,目前的版本号为5.5.64.如果想安装最新的10.x版本,则需要使用MariaDB的官方源. 1)配置官方源: 在/etc ...
- 《JavaScript高级程序设计》读书笔记(三)基本概念第三小节 String、Object类型
内容---语法 上一小节---数据类型 本小节 String类型---流程控制语句---理解函数 String类型--零个或者多个16位Unicode字符组成字符序列,即字符串--可以由双引号&quo ...
- Python识别验证码,基于Tesseract实现图片文字识别
一.简介 Tesseract是一个开源的文本识别[OCR]引擎,可通过Apache 2.0许可获得.它可以直接使用,或者使用API从图像中提取打印的文本,支持多种语言.该软件包包含一个ORC引擎[li ...
- 【代码审计】VAuditDemo 重装漏洞
一.源码安装漏洞介绍 一般在PHP源码程序都有一个初始安装的功能,如果相关代码没有对参数进行严格过滤,可能会导致攻击者访问安装页面(install.php)或构造数据包,对网站进行重新安装,从而危害网 ...
- Spring Boot 学习前你应该知道的 Maven 知识
Maven 是什么? 回答这个问题,我们先来了解下没有Maven,我们是怎么使用开发者工具IDE去开发Java程序的.我之前开发Java程序不多,但是我还是记得,我是从网上下载或从合作方拷贝 jar ...
- web打开本地文件并读取内容
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 02-14Android学习进度报告十四
今天我学习了关于构建一个可复用的自定义BaseAdapter的知识. 首先将Entity设置成泛型 代码示例: public class MyAdapter<T> extends Base ...