正解: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学习第26天

    自定义模块和包 软件开发规范

  2. VS中展开和折叠代码,还有其他快捷操作

    [转]VS中展开和折叠代码   VS2005代码编辑器的展开和折叠代码确实很方便和实用.以下是展开代码和折叠代码所用到的快捷键,很常用: Ctrl + M + O: 折叠所有方法 Ctrl + M + ...

  3. 倒影问题(reflect:below)

    这个例子灵感来源于实现一个登录框下方的倒影: .box { width: 300px; height: 200px; border: 1px solid #1f637b; -webkit-box-re ...

  4. manjaro安装及设置

    因我的笔记本(联想的拯救者)昨晚打开后什么都还没做就被更新系统“抢走”了画面导致按什么都不管用 所以就想起能不能不用win系统,都知道linux比win稳定,so....就找到了manjaro.以下是 ...

  5. c#一步一步实现ORM(二)

    c#一步一步实现ORM(二) 上一篇描述了简单的思路,这一片我们来稍微细化一下 1插入的时候忽略某些字段 public int Insert<T>(T o, params string[] ...

  6. XOR UVALive - 8512 -区间线性基合并

    UVALive - 8512 题意 :给出一个包含n个元素的数组A以及一个k,接下来进行q次询问,每次询问给出 l 和 r , 要你求出从A[l] , A[l+1] , A[l + 2],...,A[ ...

  7. 第十一篇 CBV和闪现

    前几篇写的都是FBV 现在可以了解一下CBV CBV 其实就是把请求方式都写到一个类中 学过django的一眼应该就明白了 from flask import Flask, render_templa ...

  8. URL 链接中 井号#、问号?、连接符& 分别有什么作用?

    在一个 URL 中可以包含很多的内容,其中不仅仅是包含 26 个英文字母,10 个罗马数字,中文汉字,还可以拥有井号“#”.问号“?”.连接符“&”等三种最常见的符号,那么这些符号在网站中都有 ...

  9. 07-Python入门学习-字符编码与文件处理

    字符编码 人操作计算机使用人类认识的字符,而计算机存放都是二进制数字所以人在往计算机里输入内容的时候,必然发生: 人类的字符------(字符编码表)-------->数字 比如我输入一个‘上’ ...

  10. Face The Right Way [POJ3276] [开关问题]

    题意: 有n头奶牛排成一排,有的朝前(F)有的朝后(B),现在你可以使k头奶牛一次性翻转朝向(n>=k>=1),问你最少的翻转次数和此时对应的k值. Input Line 1: A sin ...