ACM_Suffix_Array
文章平均质量分 78
Gatevin
这个作者很懒,什么都没留下…
展开
-
POJ 1743 Musical Theme 后缀数组 楼教主男人八题之一
题目大意:就是现在用1~88表示钢琴上的88个不同的音符(notes), 现在定义一段旋律(theme)是一串连续的音符组成,判断给出的长度为N( N 输出找到的最大长度的theme,如果不存在满足以上条件的theme,输出0大致思路:后缀数组的论文题= =...听说是楼教主男人八题之一Orz....首先为了避免判断theme的变化, 即使所有theme中的所有note原创 2015-02-02 14:17:25 · 660 阅读 · 0 评论 -
POJ 3415 Common Substrings 后缀数组 + 单调栈维护
题目大意:用A[i, k]表示以字符串第i位开始长度为k的字符串, B[j, k]同理对于给定的字符串A,B和整数K, 求使得A[i, k] == B[j, k]的三元组(i, j, k)的数量, 其中要求k >= K大致思路:很容易想到先将两个字符串连接起来中间用一个没有出现的值隔开, 求后缀数组首先如果我们只考虑对于给定的k == K的三元组数量, 是可以直接根据后原创 2015-02-05 15:51:48 · 682 阅读 · 1 评论 -
(CDOJ) UESTC 606 Palindrome Again 后缀数组二分 + Manacher + Hash
题目大意:就是现在给出两个只包含小写字母的字符串A, B, 一个正整数d, 求三元组(i, j, k)满足A[i, i + 1, .... i + k - 1] == B[j, j + 1, ... j + k - 1] , 且A[i, i + 1, ..., i + k - 1]是回文串, k >= d的三元组数量大致思路:做了2012长春那场区域赛的G题之后就会做这题了..原创 2015-03-29 21:42:31 · 843 阅读 · 0 评论 -
UVALive 5794 (UVA 12361) File Retrieval 后缀数组 + 分治dfs
题目大意:就是现在给出F(1 大致思路:首先不难想到将F个串中间用未出现的不同字符隔开连接起来, 然后处理出后缀数组, 然后我们可以用后缀树的样子来看这些后缀之间的关系(后缀树组作为工具), 不能发现如果某一段连续的极大区间[L, R]中的height值都 >= h(也就是这个区间旁边的 < h),那么我们对于后缀sa[L - 1], sa[L], .... sa[R]的前 <原创 2015-03-12 20:07:53 · 892 阅读 · 0 评论 -
Codeforces 452E Three strings 后缀数组 + 并查集
题目大意:就是现在给出三个总长度不超过3*10^5的字符串, 每个字符串只包含字母'a' ~ 'z', 现在对于每一个L, (1 大致思路:首先不难想到后缀数组处理三个串拼接起来的总串, 记录每一个字符的来源, 也就是记录每个后缀的来源, 然后需要根据height数组从大到小来利用并查集标记区间进行计算, 注意两个区间合并的时候之后 (i, j, k)三者不来自同一个原来的区间原创 2015-03-18 18:33:33 · 1036 阅读 · 0 评论 -
Codeforces Gym 100548G The Problem to Slow Down You (Palindromic Tree 或 Hash水过) 2014西安现场赛G题
题目大意:就是现在给你两个长度不超过20W的字符串, 都只包含小写字母, 求相同的回文串对数 (S, T), 其中S == T, S来自第一个字符串, T来自第二个字符串, S和T都是回文串大致思路:首先很容易想到的是Manacher + 后缀数组二分 + Hash的做法, 复杂度O(nlogn), 可惜的是这个题目Hash容易被卡试了好几次Hash之后试了一发二次Hash原创 2015-03-31 18:17:44 · 2432 阅读 · 0 评论 -
POJ 1509 Glass Beads 后缀自动机 或 后缀数组
题目大意:就是现在对于一个字符串S, 每次都可以将第一个字符放到最后面, 这样一共有lenght(S)中串, 求这样的床中字典序最小的那个的起始位置是第几个字符时最小大致思路:首先后缀数组的做法不难想到, 就是将S变成SS之后求一遍后缀数组, 扫一遍height数组, 找到第一个sa[i] = 0的那个sa[i],然后对于从这个位置开始的连续的height[i] >= leng原创 2015-04-11 14:57:04 · 1201 阅读 · 0 评论 -
HDU 4436 str2int 后缀数组 + 前缀和预处理 或 后缀自动机
题目大意:对于给出的n个字符串(n 例如串"101"子串有 1, 10, 101, 0, 01, 1, 对应的不同整数是1, 10, 101 (0对求和没有影响, 可以略去)大致思路:首先第一眼看得出和后缀数组有关, 但是将所有的串连接起来之后, 有一些计数上的细节需要考虑, 首先如果后缀以'0'开头则不需要加入计数(这样的后缀的所有子串对应的整数一定会在其他的后缀当中出现原创 2015-03-09 21:52:37 · 975 阅读 · 0 评论 -
Codeforces 427D Match & Catch 后缀自动机 或 后缀数组
题目大意:就是对于两个字符串S1和S2, 求出他们最短的一个公共字串P, 满足P在S1中只出现1次, P在S2中也只出现一次, 输出P最小的长度, 如果这样的P不存在, 输出-1大致思路:很明显的一个做法是将S1和S2连接起来中间用未出现的字符隔开, 然后建立后缀自动机, 记录每一个状态中表示的字符串的来源(可以状压记录), 然后所有状态中, 满足Right集合为2, 且状压表原创 2015-04-16 20:45:40 · 1128 阅读 · 0 评论 -
HDU 4622 Reincarnation 后缀数组 或 后缀自动机
题目大意:就是现在给定字符串S (长度不超过2000), 接下来是Q次询问(Q 大致思路:首先如果用后缀数组的话不难想到求出S的后缀数组之后, 对于每一次询问 l, r, 遍历height数组找到 l 0)这样复杂度是O(Q|S|)如果用后缀自动机来做的话我刚开始想的是对于S建立后缀自动机之后, 对于每次询问, 将子串[l, r]在S的后缀自动机上遍历一遍,原创 2015-04-16 19:58:15 · 1058 阅读 · 0 评论 -
HDU 3336 Count the string 后缀数组 或 (KMP + DP)
题目大意:就是现在给出一个长度不超过20W的字符串S, 对于这个字符串求其所有前缀在串中出现次数的和, 结果对10007取模大致思路:很容易想到后缀数组, 找到sa[i] = 0的那个就是串S, 那么找出这个位置向两边能扩展到的长度即可, 就是利用一下height数组就行了, 没什么难度= =还是不清楚的话看代码细节吧代码如下:Result : Acce原创 2015-05-04 18:17:31 · 824 阅读 · 0 评论 -
HDU 5008 Boring String Problem 后缀数组
题目大意:就是给出一个字符串(长度不超过10W), 接着Q次询问, 对于每次询问要找到第K小子串, 注意这里的字串是本质不同的子串, 大致思路:由于Q可以达到10^5 使用后缀自动机的话容易超时, 于是需要使用后缀数组, 对于给出的字符串求出后缀数组之后利用height数组处理出前i个分支下有多少个不同的子串, 那么对于每次询问二分查找即可, 由于每次回答的[l, r]中l药最原创 2015-05-04 15:56:03 · 739 阅读 · 0 评论 -
HDU 4691 Front compression 后缀数组
题目大意:就是按照题目给出的压缩方式计算初始的数据长度和压缩后的数据长度大致思路:其实就是相当于对于N次询问要查询后缀l1, 后后缀l2的最长公共前缀, 注意l1 == l2的时候直接判就行了然后就是之一公共长度的位数也会影响结果, 例如10这个要占两个空间代码如下:Result : Accepted Memory : 12636 KB原创 2015-05-05 10:20:34 · 650 阅读 · 0 评论 -
HDU 4552 怪盗基德的挑战书 (KMP + DP) 或 后缀数组
题目大意:和HDU 3336简直一模一样啊.....大致思路:就是KMP + DP 或者后缀数组都可以做...细节见这个吧: HDU 3336题解一模一样不吐槽了...代码如下:Result : Accepted Memory : 2448 KB Time : 15 ms/* * Author: Gatevin * C原创 2015-05-05 10:36:15 · 600 阅读 · 0 评论 -
FZU 2137 奇异字符串 后缀数组
题目大意:就是现在跟定一个字符串长度不超过10^5, 求其所有子串中奇异字符串的价值和奇异字符串的定义为形似AxA的串, x是一个字母, A是非空字符串, 且A中没有x出现, 其价值是长度的平方大致思路:首先这个题不要想复杂了, 暴力即可, 想处理出后缀数组, 然后枚举x的位置, 之后从x想两边扩张, 遇到边界或者x时停止, 对于每一次枚举都直接利用后缀数组的预处理查询LC原创 2015-05-28 18:29:56 · 660 阅读 · 0 评论 -
HDU 4029 Distinct Sub-matrix 后缀数组 + Hash 2011年上海网络赛I题
题目大意:就是现在给出一个N*M的字符矩阵, 包含N*M个大写字母, 求其有多少个本质不同的子矩阵N, M 大致思路:这个题目当时想的时候以为是AC自动机来进行匹配, 但是128*128*128*128的复杂度太高了当时还是没有仔细想这个题, 其实考虑一维的字符串中计算不同的子串个数的时候, 用到的后缀数组的方法, 就应该知道这题怎么做的首先需要原创 2015-07-23 23:09:47 · 908 阅读 · 0 评论 -
ZOJ 3199 Longest Repeated Substring 后缀数组 + RMQ预处理
题目大意:给定多个长度不超过50000的字符串, 求最长的重复子串的长度, 最长重复子串s定义为, 在s出现之后紧跟这又出现一次的串(两次出现相邻但没有交集)大致思路:很容易想到用后缀数组来做, 从长到短枚举长度即可, 由于长度为L的串必定覆盖s[0], s[L], s{2*L]...s[k*L]中的恰好一个, 所以就可以用一个很常见的枚举来O(nlogn)解决这个问题了细原创 2015-03-10 17:09:39 · 698 阅读 · 0 评论 -
URAL 1297 Palindrome 后缀数组 或 Manacher 求最长回文子串
题目大意:就是给出一个长度不超过1000个只包含大小写英文字母的字符串,输出其最长回文子串大致思路:首先很容易想到用将该字符串本身反转之后与自己连接起来, 中间用一个未出现的字符隔开, 求出后缀数组刚开始想的是枚举回文串长度,但是发现不能二分判断改长度是否就满足题意, 于是想到一个枚举起点和长度利用RMQ查询和对称性判断的O(n*n)的方法不过这样并不是最好的枚举方法原创 2015-02-09 19:44:32 · 720 阅读 · 0 评论 -
HDU 4426 (ZOJ 3661) Palindromic Substring 后缀数组二分 + Manacher + Hash
题目大意:就是现在对于T(T 大致思路:首先用Manacher算法处理出各个字符为中心的回文半径, 然后由于一个长度为n的字符串中最多只有O(n)个不同的回文串(其实位置不同但序列相同视为相同), 所以可以再利用mx的右移来判断是否可能出现的新的回文串 ( mx 参照2014年国家集训队徐毅论文中Manacher的做法), 对于每一种回文串Hash判重即可然后对于每一种回文原创 2015-03-27 09:23:35 · 1161 阅读 · 0 评论 -
POJ 1226 Substrings KMP暴力 或 后缀数组
题目大意:就是现在多组测试数据( 大致思路:首先一个简单的想法是用KMP来水过.....暴力枚举最短的那个串的所有子串判断是否满足条件即可..而且用时还很短,能水过另外一个想法是使用后缀数组, 应该算作是正解了= =两个想法各自的代码如下:KMP暴力:暴力枚举最短的那个串的所有子串进行匹配判断即可Result : Accepted Mem原创 2015-02-01 16:47:28 · 747 阅读 · 0 评论 -
POJ 2406 Power Strings KMP 或 后缀数组
题目大意:就是给出一个串S 长度不超过10^6, 求最大周期使得S = a^n也就是S是有n个字符串a连接起来的,求最大的n(也就是找到最短的a即可)大致思路:首先利用KMP的next数组可以知道循环节的个数, 为n/(n - next[n]) n是S的长度, 这个感觉还是有点晕...另外一个做法是使用后缀数组KMP的做法:代码如下:Result :原创 2015-02-02 20:41:09 · 582 阅读 · 0 评论 -
POJ 3261 Milk Patterns 后缀数组
题目大意:就是现在统计了一头牛N填的奶的产量(话说20000天这牛多少岁了? = =)就是一个长度为N的整数列问其中最长的重复出现次数不小于K的子串的长度是多少大致思路:很明显用后缀数组, 首先考虑到输入的数=L,判断连续次数是否>=K即可,考虑到如果长度为L的可以,那么长度为L - 1的也可以,具有单调性,使用二分即可查找出最长的长度一发AC感觉真好....原创 2015-02-03 13:16:53 · 721 阅读 · 0 评论 -
POJ 2774 Long Long Message 后缀数组
题目大意:给出两个很长的串(长度分别 大致思路:用后缀数组的话很明显是个水题,将两个串连起来中间用一个没有出现的值隔开然后求出后缀数组和height数组找到sa[i]及sa[i - 1]来自不同的串的时候height数组的最大值即可代码如下:Result : Accepted Memory : 5512 KB Time : 375原创 2015-02-03 12:36:58 · 977 阅读 · 0 评论 -
SPOJ 694 DISUBSTR Distinct Substrings 后缀数组
题目大意:对于给出的字符串(长度不超过1000) 求其不同的子串的个数大致思路:就是一个简单的height数组性质的利用, 如果每个子串我们用从位置j开始且长度为k来表示不同的子串的话则一个height[i]值说明表示从位置sa[i - 1]开始的和sa[i]开始的长度为k 所以用全部的子串数减去重复出现的即可, 具体见代码注释代码如下:Result原创 2015-02-09 13:46:38 · 594 阅读 · 0 评论 -
SPOJ 705 SUBST1 New Distinct Substrings 后缀数组
题目大意:给出一个字符串(长度 大致思路:和SPOJ 694. Distinct Substrings 一样....买一送一..../* * Author: Gatevin * Created Time: 2015/2/9 13:25:03 * File Name: Iris_Freyja.cpp */#include#include#include#in原创 2015-02-09 13:55:36 · 746 阅读 · 0 评论 -
SPOJ 220 PHRASES Relevant Phrases of Annihilation 后缀数组
题目大意:就是现在给出T组测试数据(T 对于每一组, 求在所给的所有串都出现了至少两次的子串的最大长度, 每个串中出现的两次不能有重叠部分大致思路:很明显的后缀数组利用height数组进行分组的题刚开始的时候没有考虑出现的两次不重合(没仔细读题以为可以...) WA了2发= =具体细节见代码:代码如下:Result : Accepted原创 2015-02-09 15:03:56 · 586 阅读 · 0 评论 -
URAL 1517 Freedom of Choice 后缀数组
题目大意:就是对于给出两个长度都为N的只包含大写字母的串求其最长公共子串存在多个长度相同的的串时输出任意一个大致思路:就是一个简单的后缀数组的题...很简单了...细节见代码代码如下:Result : Accepted Memory : 6774 KB Time : 218 ms/* * Author: Gatevin原创 2015-02-09 16:29:43 · 575 阅读 · 0 评论 -
POJ 3294 (UVA 11107) Life Forms 后缀数组
题目大意:给出n( n 求出最长的子串,满足在n个字符串当中出现在一半以上的字符串上, 如果有多个这样的子串,按字典序输出大致思路:简单的后缀数组height数组分组的运用, 首先将所有的串都连接起来, 中间用不同的没有出现在n个字符串中的字符隔开, 然后二分子串长度L判断是否存在满足条件的长度为子串, 对于多个解用vector存储一下其起始位置,最后还原字符串排序后输出即原创 2015-02-03 14:37:21 · 1028 阅读 · 0 评论 -
POJ 3693 Maximum repetition substring 后缀数组 + RMQ预处理
题目大意:定义一个字符串的repetition number表示这个字符串某个重复出现的子串的出现次数, 每次出现不重合比如abababab是ab重复4次其repetition number是4, 而ababa包含两个有重叠的‘aba’, 只能算repetition number是1(1个‘ababa')给出一个长度不超过100,000的字符串,求出这个字符串的所有子串中repetitio原创 2015-02-09 13:13:51 · 660 阅读 · 0 评论 -
SPOJ 687 REPEATS Repeats 后缀数组 + RMQ预处理
题目大意:对于给出的字符串(长度大致思路:就是POJ 3693那题的简单版本....不需要找到字典序最小的....首先有这样一个事实: 对于任何一个子串, repetition number >= 1, 所以对于repetition number为1的只需要找到字典序最小的那个字母即可, 那么我们只考虑repetition number >= 2的情况, 如果每一个循环节的原创 2015-02-09 15:53:54 · 1087 阅读 · 0 评论 -
UVALive 4513 (LA 4513) Stammering Aliens 后缀数组 或 hash
题目大意:白书例题给出一个整数m>=1和一个字符串(m 如果有多个子串满足条件输出出现位置最右的大致思路:首先很容易想到后缀数组的做法. 利用height数组分组, 很简单就不说了, 细节见代码另外白书上说可以用hash, 所以用这个题试了一下hash表示第一次用hash...然后就坑了有木有= =刚开始我取得是H函数中x = 2的情况来写这样可原创 2015-02-11 21:16:16 · 759 阅读 · 0 评论 -
CodeForces 128B String 后缀数组 或 优先队列维护 求第K小子串
题目大意:给出一个长度不超过10^5的字符串求其所有子串当中字典序排行第K(K 此题对于多个子串相同的视为不同子串,即起点不同也视为不同大致思路:刚开始想的是后缀数组的解法, 首先对于这个字符串求后缀数组之后, 利用得到的sa数组的字典序, 因为这里的相同子串要多次计数, 所以对于后缀sa[i]和其他串的LCP也要多次计于是计数稍微有点麻烦, 需要对每次连续的公共前缀多原创 2015-02-14 20:16:12 · 1926 阅读 · 0 评论 -
UVALive 2775 (LA 2775) Hidden Password 后缀数组
题目大意:对于一个字符串定义其 one-letter left cyclic shifts 为将其前 i (0 比如“abcde”这个串根据这个定义得到的就是abcdebcdeacdeaddeabceabcd一共5行, 第 i 行是将前i个字符搬到后面得到的字符串, i 从0开始计数现在对于给出的字符串S长度为L (5 大致思路:很容易想到后缀数原创 2015-02-15 16:08:32 · 712 阅读 · 0 评论 -
UVA 10829 L-Gap Substrings 后缀数组
题目大意:现在定义如果一个字符串S可以被写成UVU的形式(U, V是两个非空字符串), 且V的长度是L, 那么串S是L-Gap串一个字符串可能既是L1-Gap串又是L2-Gap串, 现在给出一个字符串S(其长度不超过50000)给定整数G, 求给出的字符串的所有子串中G-Gap字符串的数量(如果多个子串相同但是出现位置不同视为不同子串)大致思路:刚开始我想的是枚举G-G原创 2015-02-13 15:52:03 · 1404 阅读 · 1 评论 -
HDU 5219 Repeating 后缀数组 + 莫比乌斯函数
题目大意:就是现在给出一个长度不超过100100的只包含小写字母的字符串, 求问这个串有多少个字串没有循环节, 如abab有循环节ab, 而aba, a, abc没有大致思路:好久没写题解了...补一个历史遗留的坑...首先这题要先枚举循环节长度, 然后找到所有的可以以这个长度为循环节的串根据每次枚举的循环节长度将串分成多个长度为L的组, 然后用后缀数组找出连续的一整段原创 2015-09-27 20:52:51 · 931 阅读 · 0 评论