正解:SA

解题报告:

我永远喜欢loj!

显然$AABB$串相当于是由两个$AA$串拼起来的,所以可以先考虑如果求出来了所有$AA$串怎么求答案?

就假如能统计出$st[i]$表示所有以$i$为开头的$AA$串的个数,$en[i]$表示所有以$i$为结尾的$AA$串的个数,$ans$就会等于$\sum en[i]\cdot st[i+1]$,$O(n)$地求下就好$QwQ$

于是现在的目标就是快速地求出$st$数组和$en$数组辽

这儿有四个方法(两个暴力+两个正解),大概会分别港下$QwQ$

第一个暴力就很$easy$啊,就字符串的题想不出来正解的时候自然而然就会想到用哈希乱搞一通,,,?

这题的话哈希就非常无脑啊,$O(n^{2})$做下就好,,,

瞎解释下趴,就以$st$为$eg$,先循环一个$i$表示起始位置,然后循环一个$y$表示长度,判一下$str[i\sim i+j-1]$484等于$str[i+j\sim i+2\cdot j-1]$就好

然后这就有95$pts$了,,,

然后对于这个暴力,其实优化下就有100$pts$了

就一般来说看到哈希,自然而然就再想到二分+哈希?于是就更进一步,考虑如果用二分优化下怎么搞

首先考虑到每次先枚举长度$l$,然后每隔$l$设一个关键点,那么显然每个长度为$2\cdot l$的串$AA$一定会经过两个关键点

于是考虑对每个关键点求出它和前一个点前缀的最长公共后缀和后缀的最长公共前缀,这儿显然是可以哈希求的不说

然后判一下,如果$lcp$的长度和$lcs$的长度之和大于等于$l$就说明可以组成,然后因为有多次修改但只有一次输出,$so$可以差分下

然后就做完辣!

然后如果能get这个想法,就可以想到,显然$SA$也是可做的鸭$QwQ$

就现在从这个$hash$可以看出,其实现在的瓶颈就快速求出相邻两点的$lcp$和$lcs$嘛,然后上面是用了个二分+哈希搞过去了

那就显然考虑用$SA$,欧克水过去辣!

(听说$SA$能做的$SAM$都能做,,,?$so$也许学了$SAM$之后我还会来$upd$下$SAM$的$code$趴$QwQ$

说得有些简略,,,也麻油放代码,,,然后$kmp$的做法也还麻油写,,,

期中考完如果还没退组再仔细写下然后放代码趴$QAQ$

loj2083 优秀的拆分 [NOI2016] SA的更多相关文章

  1. [BZOJ]4650 优秀的拆分(Noi2016)

    比较有意思的一道后缀数组题.(小C最近是和后缀数组淦上了?) 放在NOI的考场上.O(n^3)暴力80分,O(n^2)暴力95分…… 即使想把它作为一道签到题也不要这么随便啊摔(╯‵□′)╯︵┻━┻ ...

  2. UOJ#219/BZOJ4650 [NOI2016]优秀的拆分 字符串 SA ST表

    原文链接http://www.cnblogs.com/zhouzhendong/p/9025092.html 题目传送门 - UOJ#219 (推荐,题面清晰) 题目传送门 - BZOJ4650 题意 ...

  3. [BZOJ]4650 优秀的拆分(Noi2016)(哈希+二分)

    传送门   题解 听说大佬们这题都是用SA秒掉的 然而SA的时间复杂度的确很优秀,缺点就是看不太懂…… 然后发现一位大佬用哈希华丽的过了此题,而且讲的特别清楚->这里 我们只要考虑以每一个点结尾 ...

  4. [NOI2016]优秀的拆分 后缀数组

    题面:洛谷 题解: 因为对于原串的每个长度不一定等于len的拆分而言,如果合法,它将只会被对应的子串统计贡献. 所以子串这个限制相当于是没有的. 所以我们只需要对于每个位置i求出f[i]表示以i为开头 ...

  5. [NOI2016]优秀的拆分(SA数组)

    [NOI2016]优秀的拆分 题目描述 如果一个字符串可以被拆分为 \(AABB\) 的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 \(aabaaba ...

  6. 并不对劲的bzoj4650:loj2083:uoj219:p1117:[NOI2016]优秀的拆分

    题目大意 "优秀的拆分"指将一个字符串拆分成AABB的形式 十次询问,每次给出一个字符串S(\(|S|\leq3*10^4\)),求它的所有子串的优秀的拆分的方案数之和 题解 此题 ...

  7. UOJ#219. 【NOI2016】优秀的拆分 [后缀数组 ST表]

    #219. [NOI2016]优秀的拆分 题意:求有多少AABB样子的子串,拆分不同的同一个子串算多个 一开始一直想直接求,并不方便 然后看了一眼Claris的题解的第一行就有思路了 如果分开,求\( ...

  8. 【BZOJ4650】【NOI2016】优秀的拆分(后缀数组)

    [BZOJ4650][NOI2016]优秀的拆分(后缀数组) 题面 BZOJ Uoj 题解 如果我们知道以某个位置为开始/结尾的\(AA\)串的个数 那就直接做一下乘法就好 这个怎么求? 枚举一个位置 ...

  9. 「NOI2016」优秀的拆分 解题报告

    「NOI2016」优秀的拆分 这不是个SAM题,只是个LCP题目 95分的Hash很简单,枚举每个点为开头和末尾的AA串个数,然后乘一下之类的. 考虑怎么快速求"每个点为开头和末尾的AA串个 ...

随机推荐

  1. Python-Django-Ajax

    什么是Ajax: 通过js语言跟后台进行交互的一个东西 -特点:异步,局部刷新 ajax往后台提交数据 $.ajax({ url:'请求的地址', type:'get/post', data:{key ...

  2. Python编码规范(PEP8)

    Introduction 介绍 本文提供的Python代码编码规范基于Python主要发行版本的标准库.Python的C语言实现的C代码规范请查看相应的PEP指南1. 这篇文档以及PEP 257(文档 ...

  3. sonar-代码扫描

    代码测试sonar 1.下载地址: https://www.sonarqube.org/downloads/ 2.配置jdk环境(版本要求1.8+) [root@localhost#>> ...

  4. Java 模板模式

    定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现 模板方法使得子类可以在不改变算法的结构的情况下,重新定义算法的某些步骤 类型:行为型 一次性实现一个算法的不变的部分,并将可变的行为留给 ...

  5. Mybatis内批量插入Oracle

    <insert id="insertManagerInfoBatch" parameterType="java.util.List"> <se ...

  6. JS对象的拷贝

    1:对数据进行备份的时候,如果这个数据是基本的数据类型,那么很好办,通过赋值实现复制即可. 赋值与浅拷贝的区别 var obj1 = { 'name' : 'zhangsan', 'age' : '1 ...

  7. [Python]Python中的浅复制与深复制

    看python的文档,发现list有copy方法,描述说效果同a[:]. 感觉有点惊讶,之前一直以为a[:]执行的是深复制. test了一下,发现确实如果a中存在可变对象,如list/set/dict ...

  8. BZOJ5254 : [Fjwc2018]红绿灯

    显然所有询问都要经过至少$\sum d$,只需要考虑除了$\sum d$之外的等待红灯的时间. 将所有询问的时间模$g+r$,并按时间用set维护. 那么对于每个红灯,在set中可以找出$1$到$2$ ...

  9. 如何使用JavaScript实现纯前端读取和导出excel文件

    js-xlsx 介绍 由SheetJS出品的js-xlsx是一款非常方便的只需要纯JS即可读取和导出excel的工具库,功能强大,支持格式众多,支持xls.xlsx.ods(一种OpenOffice专 ...

  10. NOIP-机器翻译

    题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先在内存中查 ...