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

正解: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$…
比较有意思的一道后缀数组题.(小C最近是和后缀数组淦上了?) 放在NOI的考场上.O(n^3)暴力80分,O(n^2)暴力95分…… 即使想把它作为一道签到题也不要这么随便啊摔(╯‵□′)╯︵┻━┻ Description 如果一个字符串可以被拆分为 AABB 的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 aabaabaa,如果令 A=aab,B=a,我们就找到了这个字符串拆分成 AABB的一种方式. 一个字符串可能没有优秀的拆分,也可能存在不止…
原文链接http://www.cnblogs.com/zhouzhendong/p/9025092.html 题目传送门 - UOJ#219 (推荐,题面清晰) 题目传送门 - BZOJ4650 题意 如果一个字符串可以被拆分为AABB的形式,其中AA和BB是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 现在给出一个长度为n的字符串S,我们需要求出,在它所有子串的所有拆分方式中,优秀拆分的总个数.这里的子串是指字符串中连续的一段. 多组数据,数据组数$\leq 10,n\leq 3000…
传送门   题解 听说大佬们这题都是用SA秒掉的 然而SA的时间复杂度的确很优秀,缺点就是看不太懂…… 然后发现一位大佬用哈希华丽的过了此题,而且讲的特别清楚->这里 我们只要考虑以每一个点结尾的$AA$串的个数$u[i]$和以每一个点开头的AA串的个数$v[i]$,答案就是$\sum _{i=1}^{n-1} u[i]*v[i+1]$ 那么考虑如何求出$u$和$v$呢 我们考虑一下,枚举串$A$的长度$len$,然后每隔$len$个单位设置一个关键点.不难发现,每一个长度为$len*2$的$A…
题面:洛谷 题解: 因为对于原串的每个长度不一定等于len的拆分而言,如果合法,它将只会被对应的子串统计贡献. 所以子串这个限制相当于是没有的. 所以我们只需要对于每个位置i求出f[i]表示以i为开头的形如BB这样的串的个数,g[i]表示以i为结尾的形如AA这样的串的个数即可. 考虑分别处理这2个数组. 我们可以枚举AA(BB)这样的串中A(B)的长度l,然后把原串每l个字符放在一个块中,在考虑统计答案. 先考虑这样一个问题: 假如固定一个串的结尾,再枚举这个串A的长度,怎样可以判断是否合法?…
[NOI2016]优秀的拆分 题目描述 如果一个字符串可以被拆分为 \(AABB\) 的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 \(aabaabaa\) ,如果令 \(A=aab\) , \(B=a\) ,我们就找到了这个字符串拆分成 \(AABB\) 的一种方式. 一个字符串可能没有优秀的拆分,也可能存在不止一种优秀的拆分.比如我们令 \(A=a\) , \(B=baa\) ,也可以用 \(AABB\) 表示出上述字符串:但是,字符串 \(…
题目大意 "优秀的拆分"指将一个字符串拆分成AABB的形式 十次询问,每次给出一个字符串S(\(|S|\leq3*10^4\)),求它的所有子串的优秀的拆分的方案数之和 题解 此题过于优秀,题解先坑着 代码 #include<algorithm> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime>…
#219. [NOI2016]优秀的拆分 题意:求有多少AABB样子的子串,拆分不同的同一个子串算多个 一开始一直想直接求,并不方便 然后看了一眼Claris的题解的第一行就有思路了 如果分开,求\(f[i]\)以i结尾AA形式子串和\(g[i]\)以i开始AA形式子串 就可以套路了 使用常用技巧,枚举\(L=|A|\),AA子串一定覆盖了两个关键点,枚举更新就行了,对于区间加可以使用差分 其实这道题很好拿95分啊,\(O(n^2)\)用哈希判断就行了 #include <iostream>…
[BZOJ4650][NOI2016]优秀的拆分(后缀数组) 题面 BZOJ Uoj 题解 如果我们知道以某个位置为开始/结尾的\(AA\)串的个数 那就直接做一下乘法就好 这个怎么求? 枚举一个位置 枚举串的长度 直接暴力算就好啦 至于是否可行,用\(SA\)求\(lcp\)就好啦 这样就是\(95\)分 NOI这么好拿部分分的??? #include<iostream> #include<cstdio> #include<cstdlib> #include<c…
「NOI2016」优秀的拆分 这不是个SAM题,只是个LCP题目 95分的Hash很简单,枚举每个点为开头和末尾的AA串个数,然后乘一下之类的. 考虑怎么快速求"每个点为开头和末尾的AA串个数" 考虑枚举A的长度,然后在序列中每|A|个位置放一个关键点,这样每个AA至少都经过了一个关键点. 然后求相邻两个关键点的lcs,lcp,画画图匹配一下,可以把区间内的都求出来了. 可以Hash二分或者sa或者sam Code: #include <cstdio> #include &…