题目大意:给你一个字符串,求所有子串的所有优秀拆分总和,优秀的拆分被定义为一个字符串可以被拆分成4个子串,形如$AABB$,其中$AA$相同,$BB$相同,$AB$也可以相同 作为一道国赛题,95分竟然就这么给我们了!只是一个$NOIP$难度的哈希套$DP$啊...... 95分就是从后往前找,统计$AA$串,每次统计一下从这个位置开始的所有子串 和 紧随其后的等长串 相同的个数$sum$ $hash(i,i+j-1)==hash(i+j,i+2*j-1) sum[i]++$ 然后再统计$BB$…
[LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分 题意 给定一个字符串 \(S\), 求有多少种将 \(S\) 的子串拆分为形如 AABB 的拆分方案 \(|S|\le 30000\) (\(95\%\) 数据 \(|S|\le 2000\)) 题解 考场上遇见这题直接打95分暴力哈希跑路就完事了吧 \(O(n^2)\) 暴力就直接枚举所有子串看它是不是 AA 型的, 在左右端点处分别标记一下, 然后枚举断点把两边的方案数乘起来就完事了. 考虑优化这个暴…
[问题描述] 如果一个字符串可以被拆分为 AABB 的形式,其中 A 和 B 是任意非空字符串, 则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 aabaabaa,如果令 A = aab, B = a, 我们就找到了这个字符串拆分成 AABB 的一种方式. 一个字符串可能没有优秀的拆分,也可能存在不止一种优秀的拆分. 比如我们令 A = a, B = baa,也可以用 AABB 表示出上述字符串:但是,字符串abaabaa 就没有优秀的拆分. 现在给出一个长度为 n 的字符串 S,我们需…
Description 题库链接 给你一个长度为 \(n\) 的只含小写字母的字符串 \(S\) ,计算其子串有多少优秀的拆分. 如果一个字符串能被表示成 \(AABB\) 的形式,其中 \(A,B\) 非空,那么称 \(AABB\) 是一个优秀的拆分.一个子串可能有多个优秀的拆分. 多组询问,询问组数 \(T\) . \(1\leq n\leq 30000,1\leq T\leq 10\) Solution 会用这题的方法的话,应该不难想. 如果记 \(s_{1_i}\) 为以 \(i\) 结…
#219. [NOI2016]优秀的拆分 题意:求有多少AABB样子的子串,拆分不同的同一个子串算多个 一开始一直想直接求,并不方便 然后看了一眼Claris的题解的第一行就有思路了 如果分开,求\(f[i]\)以i结尾AA形式子串和\(g[i]\)以i开始AA形式子串 就可以套路了 使用常用技巧,枚举\(L=|A|\),AA子串一定覆盖了两个关键点,枚举更新就行了,对于区间加可以使用差分 其实这道题很好拿95分啊,\(O(n^2)\)用哈希判断就行了 #include <iostream>…
题面:洛谷 题解: 因为对于原串的每个长度不一定等于len的拆分而言,如果合法,它将只会被对应的子串统计贡献. 所以子串这个限制相当于是没有的. 所以我们只需要对于每个位置i求出f[i]表示以i为开头的形如BB这样的串的个数,g[i]表示以i为结尾的形如AA这样的串的个数即可. 考虑分别处理这2个数组. 我们可以枚举AA(BB)这样的串中A(B)的长度l,然后把原串每l个字符放在一个块中,在考虑统计答案. 先考虑这样一个问题: 假如固定一个串的结尾,再枚举这个串A的长度,怎样可以判断是否合法?…
传送门 Description 如果一个字符串可以被拆分为\(AABB\) 的形式,其中$ A$和 \(B\)是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串\(aabaabaa\),如果令\(A=aab\),\(B=a\),我们就找到了这个字符串拆分成 \(AABB\)的一种方式. 一个字符串可能没有优秀的拆分,也可能存在不止一种优秀的拆分.比如我们令\(A=a\),\(B=baa\),也可以用 \(AABB\)表示出上述字符串:但是,字符串 \(abaabaa\) 就…
连NOI Day1T1都不会做...看了题解都写不出来还要抄Claris的代码.. 题目链接: (luogu)https://www.luogu.org/problemnew/show/P1117 (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4650 (uoj)http://uoj.ac/problem/219 题解: \(f[i]\)表示以\(i\)结束的\(AA\)型子串个数,\(g[i]\)表示以\(i\)开始的\(AA\)…
BZOJ 洛谷 令\(st[i]\)表示以\(i\)为开头有多少个\(AA\)这样的子串,\(ed[i]\)表示以\(i\)结尾有多少个\(AA\)这样的子串.那么\(Ans=\sum_{i=1}^{n-1}ed[i]*st[i+1]\). 考虑如何求\(st[i],ed[i]\).暴力的话可以枚举\(i\),然后哈希判一下.这样\(O(n^2)\)就有\(95\)分了.. 正解是,枚举长度\(len\),判断每个位置是否存在长为\(2*len\)的\(AA\)这样的子串. 每隔\(len\)的…
考虑分别计算每个位置作为AA的末尾或者BB的开头的个数 最后乘一乘就是答案 据说是套路的计算AA的方法: 首先枚举A的长度L,然后每L个字符当做一个关键点,这样的话,一个AA包含且只包含相邻两个关键点(记为a,b),而且满足lcp(a,b)+lcs(a,b)-1>=L 手画一下就能看出来 于是SA搞lcp 倒过来再SA搞lcs 最后差分一下统计答案即可 #include<bits/stdc++.h> #define pa pair<int,int> #define CLR(a…