CF319D 题解
题意
给你一个字符串 \(S\),要求你每次找到一个最短的并且最左边的形如 \(XX\)(即由两个相同的字符串拼接而成)的子串,然后把这个字符串从 \(XX\) 变成 \(X\)。问无法操作后的字符串是什么?
\(|S|\le5\times 10^4\)。
题解
首先有一个重要的结论是:设每次删去的串 \(XX\) 长为 \(2\times len\),则 \(len\) 是递增的。
因为如果将 \(XX\) 替换成 \(X\) 后出现更小的 \(len\),则其必包含 \(X\) 的前缀或后缀。而实际上这部分也被包含于 \(XX\)。故矛盾。
于是我们可以从小到大枚举 \(len\),每次删去长度为 \(2 \times len\) 的。复杂度为 \(O(n^2)\)。
但这还不够。有什么方法更优呢?
注意到如果每次能够 \(O(1)\) 判断当前 \(len\) 能否删,复杂度是 \(O(n \sqrt n)\) 的。因为 \(len\) 递增,所以能删的 \(len\) 不超过 \(\sqrt n\) 个。
如何快速判断是否有长度为 \(2 \times len\) 的 \(XX\)?这里需要用到一个强大的 trick。
每 \(len\) 个单位设置一个观察点,对每相邻两个观察点求 \(lcp\) 与 \(lcs\)。如果存在两个相邻的观察点的 \(lsp+lcs>len\),那么就存在。
证明不难。实际上这个方式判断的是长度 \(\ge 2 \times len\) 的 \(XX\),但因为我们从小到大枚举,故等价。
这样判断的复杂度是 \(O(n\log^2n)\) 的。足以通过此题。
CF319D 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
		
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
 - noip2016十连测题解
		
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
 - BZOJ-2561-最小生成树 题解(最小割)
		
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
 - Codeforces Round #353 (Div. 2) ABCDE 题解 python
		
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
 - 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
		
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
 - 2016ACM青岛区域赛题解
		
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
 - poj1399 hoj1037 Direct Visibility 题解 (宽搜)
		
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
 - 网络流n题 题解
		
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
 - CF100965C题解..
		
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
 - JSOI2016R3 瞎BB题解
		
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
 
随机推荐
- window  0x00007b无法正常启动解决方法
			
参考链接: https://pcedu.pconline.com.cn/1570/15702605.html directx修复工具下载: https://www.onlinedown.net/sof ...
 - git提交到代码到远程仓库,合并分支提示entirely different commit histories(备忘)
			
最近提交代码到github,合并分支的时候提示"master and main are entirely different commit histories" master为本地 ...
 - vue实现记录分享是否有上级
			
前言: 项目需要做活动分享功能(增加网站.app等访问量),但是,,,无功不受禄,也就需要分享时带上级ID,好友中奖,本人也受同样优惠 需求开发: 开发一个活动后,本人参加之后,分享给好友,增加自身中 ...
 - python使用pysimplegui简单制作一个exe程序
			
一.安装打包程序 控制台输入: pip install pysimplegui-exemaker -- 安装exe制作库 pip install PySimpleGUI -- 安装图形化界面编辑库 二 ...
 - # HUAWEI--IPv6 over IPv4隧道配置(简单案例)
			
HUAWEI--IPv6 over IPv4隧道配置(简单案例) 拓扑图 项目要求: PC3和PC4使用的IPv6的地址,路由和路由器之间的连接使用IPv4的地址并使用静态路由连接,路由器和PC机的连 ...
 - phpstudy 配置域名解决index.php 过多重定向
			
server { listen 80; server_name www.cqtldd.com cqtldd.com; root "D:/phpstudy_pro/WWW/tongliangd ...
 - Docker 安全加固
			
一.docker安全加固 1.利用LXCFS增强docker容器隔离性和资源可见性 (proc容器与宿主机之间是共享的 没有进行隔离) 此rpm包在真机桌面q目录中 需先传到虚拟机/root/下 在 ...
 - Ping命令的基本使用
			
一.Ping命令的基本使用 在网络中 ping 是一个十分强大的 TCP/IP 工具.我们通常会用它来直接 ping ip 地址,来测试网络的连通情况.它的作用主要为: 1.用来检测网络的连通情况和分 ...
 - Keil5 STM32  C++开发 ARM V6编译器的使用教程
			
Keil5更新之后,开始支持ARM V6编译器,新版本的编译器对C++有了更多的支持,在编译方面也做了很多的改善,具体的没有详细了解,本文只是对STM32 开发下,使用V6版本的编译器进行STM32的 ...
 - JAVA笔记_方法递归调用
			
方法递归调用 简单地说递归调用就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题,同时可以让代码变得更加简洁. 递归调用执行机制案例1: /** * @ClassName ...