https://www.lydsy.com/JudgeOnline/problem.php?id=3238 跟 bzoj3879 差不多 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 500001 int n,m,mm; char s[N]; int a[N]; int v[N]; ,k; ][N…
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式为AA的子串个数 ans= ∑ suf[i]*pre[i+1] 这两个数组的求法,类似bzoj 2119.3238 枚举|A|的长度len,将序列每len个分一块,取每块内第一个元素作为关键点 每个合法的AA恰好占据两个关键点 枚举每一个关键点i,取j=i+len 计算[i,n]和[j,n]的lcp…
题面:洛谷 题解: 因为对于原串的每个长度不一定等于len的拆分而言,如果合法,它将只会被对应的子串统计贡献. 所以子串这个限制相当于是没有的. 所以我们只需要对于每个位置i求出f[i]表示以i为开头的形如BB这样的串的个数,g[i]表示以i为结尾的形如AA这样的串的个数即可. 考虑分别处理这2个数组. 我们可以枚举AA(BB)这样的串中A(B)的长度l,然后把原串每l个字符放在一个块中,在考虑统计答案. 先考虑这样一个问题: 假如固定一个串的结尾,再枚举这个串A的长度,怎样可以判断是否合法?…
题目大意:给你一个字符串,求所有子串的所有优秀拆分总和,优秀的拆分被定义为一个字符串可以被拆分成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$…
https://www.lydsy.com/JudgeOnline/problem.php?id=2865 同上一篇博客 就是卡卡空间,数组改成map #include<map> #include<cstdio> #include<cstring> #include<algorithm> #define N 500001 using namespace std; char s[N]; map<]; ; ],len[N<<]; ]; ,p,q…
https://www.lydsy.com/JudgeOnline/problem.php?id=1396 后缀自动机的parent树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的出现次数就是子树中叶子节点的个数 所以只有叶子节点 即 |Right|=1的状态 代表的子串 出现了1次 我们计算以每一个位置为子串右端点时,它对一些位置的贡献 枚举|Right|=1的状态s 令end=Right(s) 那么以end为子串右端点,长度在[1,Max(parent(s))]的子串至少…
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\)的…
连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\)…
我们只需要统计在某一个点开始的形如$AA$字符串个数,和结束的个数相乘求和. 首先枚举循环节的长度L.即$\mid (A) \mid=L$ 然后肯定会经过s[i]和[i+L]至少两个点. 然后我们可以枚举,然后求出循环节循环的次数.起点.终点,然后发现答案更新是一段$+1$的操作, 然后就可以用差分的思想更新即可. #include <map> #include <cmath> #include <queue> #include <cstdio> #incl…
[UOJ#219][BZOJ4650][Noi2016]优秀的拆分 试题描述 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 A 和 B 是任意非空字符串,则我们称该字符串的这种拆分是优秀的.例如,对于字符串 aabaabaa,如果令 A=aab,B=a,我们就找到了这个字符串拆分成 AABBAABB 的一种方式.一个字符串可能没有优秀的拆分,也可能存在不止一种优秀的拆分.比如我们令 A=a,B=baa,也可以用 AABBAABB 表示出上述字符串:但是,字符串 abaabaa 就没…