题意

传送门

给你一个字符串 \(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 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. 渗透H5棋牌游戏-棋牌游戏开发

    0x01 前言 本來不想发的,涉及太多利益了,這些棋牌游戏的源码最高能卖到几万.开发起来不比一个商场进程难. 最近又太忙了,沒时间去做代码审计的文章了,但一不小心又抢了个运气王... 0x02 开始 ...

  2. Gitlab Ubuntu部署

    一.安装存储库 sudo curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh ...

  3. nightwatch入门教程

    Nightwatch.js 是一个用来测试web应用和网站的自动化测试框架,它是由NodeJs编写的,使用了W3C WebDriver API(之前是Selenium WebDriver) 所以我们首 ...

  4. ubuntu18.04 安装cython_bbox

    方式一: pip install cython_bbox 方式二:下载地址 https://github.com/samson-wang/cython_bbox 解压后并cd cython_bbox- ...

  5. Selenium私房菜系列6 -- 深入了解Selenium RC工作原理(1)【QQ】

    前一篇已经比较详细讲述了如何使用Selenium RC进行Web测试,但到底Selenium RC是什么?或者它由哪几部分组成呢?? 一.Selenium RC的组成: 关于这个问题,我拿了官网上的一 ...

  6. CCF 201903-2 二十四点

    #include <iostream> #include <bits/stdc++.h> #include <string> using namespace std ...

  7. JavaScript基本知识整理(基本包装类型)

    基本包装类型 为了方便地操作基本类型变量,ECMAScript规定了3个特殊引用类型分别是Boolean,Number和String. 这三种特殊引用类型同时具有基本类型和引用类型的功能,当我们读取一 ...

  8. Vue 中的 key 有什么作用?

    key 是为 Vue 中 vnode 的唯一标记,通过这个 key,我们的 diff 操作可以更准确.更快速. Vue 的 diff 过程可以概括为:oldCh 和 newCh 各有两个头尾的变量 o ...

  9. 使用layui+jQuery实现点击删除单行数据

    使用layui+jQuery实现点击删除单行数据 首先要用到layui的官网手册 地址:https://www.layui.com/ 注意1.  此功能是在使用layui展示数据的基础上实现 3.  ...

  10. 21.ubuntu16.04 Minio 集群搭建

    MinIo是什么:MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据. minio是一个非常轻量级的 ...