后缀数组
文章平均质量分 50
DZYO
Never stop
展开
-
UOJ#429. 【集训队作业2018】串串划分(循环串)
传送门题解:考虑设dpidp_idpi表示以iii结尾的前缀的划分方案数,因为有2条件的限制,可以得到容斥式子:dpi=∑j(−1)C(Sj+1,i)dpjdp_i = \sum_{j}(-1)^{C(S_{j+1,i})}dp_jdpi=j∑(−1)C(Sj+1,i)dpjC(S)C(S)C(S)表示SSS的最小循环节循环的次数,相当于从前面某个位置转移过来,中间全用相同的串划...原创 2018-11-24 22:41:54 · 1241 阅读 · 0 评论 -
BZOJ4650: [Noi2016]优秀的拆分(Hash/SA)
传送门题解: 问题首先转化为每个位置向前和向后的square串个数的乘积和。处理square串有nlognnlognn \log n做法: 首先枚举square串AAAAAA的长度的一半LLL(也就是AAA)的长度,然后square串必然经过两个相邻关键点,我们对于相邻两个串求lcs和lcp即可知道哪些位置是合法的,然后差分一下就行了。用后缀数组维护lcp,lcs,时间复杂度O(...原创 2018-05-12 11:17:57 · 278 阅读 · 0 评论 -
BJ模拟:Different Trips(树上后缀数组)
传送门题解: 后缀数组。树上唯一的不同是第二关键字要先计数排序。#include <bits/stdc++.h>using namespace std;typedef unsigned long long ULL;const int RLEN=1<<18|1;inline char nc() { static char ibuf[RLEN...原创 2018-05-03 14:38:40 · 431 阅读 · 0 评论 -
BZOJ3879: SvT(后缀数组)
传送门题解: 后缀自动机+虚树应该是一个挺显然的做法, 不过常数太大。 注意后缀数组两个位置间的height取minmin\min与建虚树等价,进一步,两个字符串的lcplcplcp是后缀数组上height取minmin\min,我们按照在后缀数组上相邻的位置排序,建一个新heightheightheight数组,就相当与原来的虚树,单调栈处理出左右比他小的第一个位置,就可以直接统计贡献了...原创 2018-04-10 08:49:20 · 334 阅读 · 0 评论 -
BJ模拟:string(后缀数组+Trie+ST表+分块)
给定一个长度为mm的01串AA,nn个长度为LiL_i的01串BiBi(总长为LL)。另有一个长度为nn的序列cic_i,表示BiB_i被选中1次的代价。要求将A划分成若干个串,并为每个划分出来的子串找一个BkiB_{k_i}(kik_i可以重复,重复代价算多次),满足此子串是BkiB_{k_i}的前缀或后缀。求最小总代价,如果不存在这样的划分,输出−1-1。为了造福群众,把数据放出来吧:http原创 2017-12-19 21:48:22 · 601 阅读 · 0 评论 -
NOIP模拟:字符串(后缀数组)
给定两个字符串 s1 和 s2 ,两个字符串都由 26 个小写字母中的部分字母构成。现在需要统计 s_2 在 s_1 中出现了的次数。 对于 s1 中的每个位置 i ,设 strlen(s2)=mstrlen(s2)=m ,若: ∑j=1m[s1[i+j−1]!=s2[j]]≤k\sum_{j=1}^{m}[s_1[i+j-1]!=s_2[j]]\le k (最外层中括号为布尔表达原创 2017-11-09 18:20:01 · 382 阅读 · 0 评论 -
bzoj 3998 弦论(后缀自动机, 后缀数组)
弦论(BZOJ 3998) 题目大意: 对于给定的一个长度为n 的字符串S,求其第k 小的子串。询问有两种,一种只统计本质不同的子串,另一种统计位置不同的子串。 n < 5e5 , k <10e9 分析: SAM解法建出S 的后缀自动机,随后在自动机所形成的拓扑图上预处理每条边所能到达的子串个数,询问时按字典序枚举边尝试往下走即可 因为每条路径对应的字符串唯一。 对于本质不同子串,原创 2017-03-20 11:34:53 · 495 阅读 · 0 评论 -
BZOJ3238: [Ahoi2013]差异(后缀数组)
传送门题意: 给定字符串S,求∑1≤i<j≤nlen(suffix(i))+len(suffix(j))−lcp(suffix(i),suffix(j))\sum_{1\le i<j\le n}len(suffix(i))+len(suffix(j))-lcp(suffix(i),suffix(j))题解:后缀数组 首先前面的一部分,每个后缀被枚举的次数为n−1n-1,所以前部分的贡献为(n原创 2017-08-26 20:43:39 · 377 阅读 · 0 评论 -
BZOJ4516: [Sdoi2016]生成魔咒(后缀数组)
传送门 给一个串,分别求[1,r] , r=1,2,3,4….,n的不同子串个数。题解:后缀数组先把串反转,其实就是求每一个后缀的不同子串个数。依次从后往前加入后缀,一个后缀能产生的不同子串个数为这个后缀的长度减去与它的排名前一名的后缀的长度,维护前缀即可。每次插入一个后缀t,设它排名前一个后缀为p,后一个后缀为s。因为之前插入s或t后缀时必然会减去最长公共前缀,因此,答案先加上lcp(p,s原创 2017-08-26 19:24:53 · 348 阅读 · 0 评论 -
后缀数组总结
预处理使用单个子串问题1可交叉最长重复子串2不可交叉最长重复子串poj17433可交叉的k次最长重复子串子串个数问题1不相同子串个数spoj694spoj705预处理首先,使用倍增算法求出对应sa,height值,时间复杂度O(nlogn)O(nlogn)。 (具体定义参考国家集训队2009罗穗骞论文,论文中还给出一种线性做法)#include<bits/stdc++.h>usin原创 2017-08-24 21:06:06 · 667 阅读 · 0 评论 -
codevs3160:最长公共子串(后缀数组)
Description: 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度。题解:后缀数组。 两个串的最长公共字串为最大的height值(此height的两个字串属于不同串)。代码:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<algor原创 2017-04-04 20:33:15 · 399 阅读 · 0 评论 -
bzoj3230: 相似子串(后缀数组+ST表)
题解:后缀数组+稀疏表 对原串正反向建后缀数组并通过height数组求出本质不同字符串个数。 通过ST表预处理后可在O(1)时间内求出LCQ。代码:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>#include<algorithm>#include<cmath>原创 2017-04-04 20:03:30 · 361 阅读 · 0 评论 -
UOJ#433. 【集训队作业2018】串串(循环串/回文串)
传送门题解:这道题主要用到的几个性质(具体证明可以看题解):1.弱双回文串SSS的某个双回文划分ababab,满足aaa是SSS的最长回文前缀,或者bbb是SSS的最长回文后缀。2.弱双回文串SSS若有两个弱回文划分,则SSS为整周期串。3.弱双回文串SSS的周期为ttt,则其有∣S∣t\frac{|S|}{t}t∣S∣个不同的弱回文划分。我们先计算本质不同的双回文串划分,然后减去算...原创 2018-11-27 20:26:49 · 1452 阅读 · 1 评论