「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),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
随机推荐
- Mac系统中桌面图片和用户头像图片的路径
系统中的桌面图片: /Library/Desktop Pictures/ 用户头像图片: 根目录资源库/user pictures/ 参考: [https://bbs.feng.com/read-ht ...
- 【代码学习】PYTHON 进程
一.进程和程序的区别 编写完毕的代码,在没有运行的时候称之为程序 正在运行的代码,称之为进程 进程除了包含的代码意外,还需要运行的环境等 二.fork import os import time # ...
- Spring基础篇——通过Java注解和XML配置装配bean(转载)
作者:陈本布衣 出处:http://www.cnblogs.com/chenbenbuyi 本文版权归作者和博客园共有,欢迎转载分享,但必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留 ...
- python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False。
python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False. 重难点:定义函数的方法.使用str类型的find()函数,可以 ...
- 第八届极客大挑战 Web-故道白云&Clound的错误
web-故道白云 题目: 解题思路: 0x01 首先看到题目说html里有秘密,就看了下源代码如图, 重点在红圈那里,表示输入的变量是id,当然上一行的method=“get”同时说明是get方式获取 ...
- C++基础之字符串string
C++基础之字符串string 标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件.作为标准裤的一部分,string定义在命名空间std中. 定义和初始化s ...
- Windows server 2012 R2 服务器用户自动锁定
开启共享文件夹后,发现经常会自动锁定导致,共享用户无法正常访问共享文件夹(原因不明) 解决办法,打开本地安全策略 把账户锁定阈值改为0
- 「NOI2001」食物链
传送门 Luogu 解题思路 带权并查集我不会啊 考虑种类并查集(扩展域并查集的一种). 开三倍空间,一倍维护本身,二倍维护猎物,三倍维护天敌,然后用并查集搞一搞就好了. 细节注意事项 咕咕咕 参考代 ...
- Spring boot+Thymeleaf传参跳转
$.ajax(): $.ajax({ type: "get", url:"/public/inform", async: true, data: detailJ ...
- 测试环境docker-swarm安装部署
测试环境swarm安装部署 部署前增加监听docker2375端口 centos 增加tcp监听端口 修改/lib/systemd/system/docker.service sed -i ‘s/Ex ...