
字符串 - 后缀数组/SAM
NotFound1
这个作者很懒,什么都没留下…
展开
-
|poj 2774|后缀数组|Long Long Message
poj 2774给出两个字符串,求这两个字符串的公共子串。我们可以连接两个字符串,中间插入$\$,然后构造后缀数组,用heightheight数组解决。以abbbc和bbc为例。 因为后缀数组是字典序排的,所以排名最近的两个后缀拥有的最大公共前缀一定比不相邻的长。所以,由图可知,只要后缀ii的位置在串1的范围,后缀i−1i-1在串2的范围(反过来亦可),那么就可以用height[i]heigh原创 2017-05-27 22:34:11 · 457 阅读 · 0 评论 -
|算法讨论|后缀数组 学习笔记
模板及讲解 解决字符串的有力工具。 直接上代码,注释讲解(此题为uoj #35)#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#define ms(i, j) memset(i, j, sizeof i)#define FN2 "uoj35" using namespace std;const原创 2017-05-25 21:15:17 · 337 阅读 · 0 评论 -
|Poj 3581|后缀数组|Sequence
poj 3581 1. 因为第一个数比后面的大,所以将原串翻转后找出排第ii位的后缀输出,符合SA[i]>=2SA[i]>=2的最小ii(后缀数组中的排列是字典序) 2. 之后将之前已经处理的数据删掉,然后题目变为将剩下的数据分为两份翻转后字典序最小,那么我们设SS为这个序列,S1,S2,...,Sk,Sk+1,...SnS_1, S_2, ..., S_k, S_{k+1},...S_n,其中原创 2017-06-10 14:41:24 · 603 阅读 · 0 评论 -
|Poj 3623|后缀数组|Best Cow Line, Gold
poj 3623 字符串翻转后的和原串后的数组进行求后缀数组,然后之后两个指针i,ji,j选择两端rkrk值最小的输出,注意格式#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#define ms(i, j) memset(i, j, sizeof i)#define ll long longusi原创 2017-06-06 19:49:57 · 513 阅读 · 0 评论 -
|poj 3261|后缀数组|二分|Milk Patterns
poj 3261还是一样的,这题是整形数字,也可以转为字符串算法做,用后缀数组,二分以后分组判定就可以了#include<cstdio>#include<cstring>#include<algorithm>#define ms(i, j) memset(i, j, sizeof i)#define FN2 "poj3261" using namespace std;const int M原创 2017-05-29 21:27:42 · 491 阅读 · 0 评论 -
|spoj 694|后缀数组|Distinct Substrings
spoj 694给出一个字符串,求字符串中不相同的子串个数。我们可以知道,字符串中的每个子串都是某个后缀的前缀,于是题目转化为求不相同的后缀的前缀问题。对于每一个SA[k]SA[k]开始的后缀,将会增加n−SA[k]+1n-SA[k]+1个后缀,而其中height[k]height[k]个是和前面的字符串的前缀是相同的。所以答案就是所有n−SA[k]+1−height[i]n-SA[k]+1-hei原创 2017-05-29 16:14:04 · 427 阅读 · 0 评论 -
|poj 1226|后缀数组|二分|Substrings
poj 1226几本上与这题一样,只不过这里还要把读入的字符串的翻转后的字符串也要连上#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#define ms(i, j) memset(i, j, sizeof i)#define FN2 "poj1226" using namespace std;con原创 2017-05-29 14:01:05 · 532 阅读 · 0 评论 -
|poj 3294|后缀数组|二分|Life Forms
poj 3294和这题差不多,二分后后缀数组heightheight判断,此题要输出所有的解,用个数组存下每个解在aa中的起始位置即可。不同的是,此题判断时一定要找到一个height[i]<xheight[i]<x或者循环完毕heightheight才能更新解,这样才能防止重复解出现。 (ps: vivi数组不要开大了,否则memset时容易TLE)#include<cstdio>#includ原创 2017-05-29 09:36:47 · 443 阅读 · 0 评论 -
|hdu 2328|后缀数组|二分|Corporate Identity
hdu 2328给出n个字符串,输出他们的最长公共子串,无解输出”IDENTITY LOST”用不同的符号连接每个字符串,然后二分公共子串的长度,在heightheight数组中看有没有连续nn个heightheight大于公共子串的长度,如果有,那么更新答案。 (此题暴力比SA快,而且poj上用SA一直TLE,Hdu上1840ms就过了)#include<cstdio>#include<cst原创 2017-05-28 18:54:28 · 713 阅读 · 0 评论 -
|poj 1743|后缀数组|Musical Theme
poj 1743注意用heightheight分组如果最后一组最后一个元素在序列末,那么要进行处理!最方便是直接<=n<=n,还要注意的是不能重复,而且是mini+x<maximini+x<maxi不能是mini+x<=maximini+x<=maxi本题求的是长度最少为5的重复子串,并且重复子串可以加上或者减去一个数。我们将数字处理一下取差值,然后直接做,之后再结果+1+1即可#include<c原创 2017-06-10 19:50:41 · 374 阅读 · 0 评论