
SA&&SAM
文章平均质量分 79
NightRaven
cust
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
poj2774,hdu1403 lcs 后缀数组,后缀自动机
求两个字符串的最长公共字串。练习模板的题..用后缀数组就把两个串拼起来,两串之间和末尾添加分隔符,然后扫一遍height数组,判断一下sa[i],sa[i-1]是不是在两个串里,是就更新最大值,否则Continue.刚学后缀数组的时候poj上C++,G++都没问题来着,而且当时那个模板还是错的- ...今重写了下结果C++各种RE,G++倒是一次过。 #include #in原创 2013-10-05 20:13:02 · 1095 阅读 · 0 评论 -
codeforces 452E Three strings 后缀数组+并查集
给三个串s1,s2,s3,对于meig原创 2014-08-11 19:24:29 · 923 阅读 · 0 评论 -
spoj7258 Lexicographical Substring Search(SUBLEX) 后缀自动机
给一个字符串S,若干个查询,每个查询k输出字典序第k小的S的子串原创 2014-06-22 18:13:47 · 754 阅读 · 0 评论 -
poj1509 Glass Beads SAM
最近打算把SAM捡回来,找个水题先练练手...这题是给一个z原创 2014-06-20 14:48:40 · 775 阅读 · 0 评论 -
poj1226 Substrings 后缀数组
给n个字符串,求一个最长的子串,使得这个子串或子串的‘逆’在所有的字符串中至少出现一次。直接把每一个串和它翻转后的结果串起来,并且中间用分隔符分开就行,注意同一个串和它的‘逆’编成相同的号,然后二分答案+遍历height分组判断就可以了。#include #include #include #include #include using namespace std;typedef原创 2014-03-16 12:20:15 · 644 阅读 · 0 评论 -
spoj220 Relevant Phrases of Annihilation
题意是给n个串,求出一个最长的子串在每个串中至少出现两次。直接二分答案来判断,因为题目里要求在一个串中,两次出现的位置不能有交叉,所以这要想办法特殊处理下,大体的思路还是循环height数组,按>=当前二分长度来分组,处理一组时,用两个数组分别记录一下本组后缀在各个串中出现的最大位置和最小位置,那么如果某一个串上他的最大位置和最小位置的差大于等于当前长度了,就是两个没有交叉的匹配了。原创 2014-03-16 10:43:40 · 672 阅读 · 0 评论 -
UVA 11475 Extend to Palindrome KMP,后缀数组
给一个字符串,尽可能少的添加字符使他变成一个回文串,求添加之后的回文串。 这题kmp,后缀数组都能做,大体思路就是找一个最长的回文后缀,那么要添加的字符就是字符串除掉这个后缀后剩下的前缀了。找的时候可以反向拼接,构造后缀数组然后二分长度+遍历height判断;或者直接把原串接在翻转串的后面,求一下失配函数。不管是效率还是实现,感觉都是KMP好一点....KMP的代码:#inclu原创 2014-03-16 15:00:23 · 895 阅读 · 0 评论 -
poj3080,poj3450 多个字符串求最长公共子串问题 KMP,SA,SAM:
这两题都是给若干个字符串,求他们的最长公共子串,这类题可以KMP,后缀数组,后缀自动机都可以做,前两个复杂度是O(NlogN),最后一个理论上是O(N),后缀自动的做法参考spoj上这个题:http://blog.youkuaiyun.com/night_raven/article/details/12438039。 3080只有10个串,长度为60,用后缀数组的话,就把所有串串起来,求出heig原创 2014-03-09 22:28:23 · 1130 阅读 · 0 评论 -
poj3693 ,spoj687 重复次数最多的连续重复子串 后缀数组
给一个字符串,给定一个字符串,求重复次数最多的连续重复子串。 09年罗穗骞的论文里有讲这题,先引用一下论文里的讲解: 先穷举长度L,然后求长度为L 的子串最多能连续出现几次。首先连续出现1 次是肯定可以的,所以这里只考虑至少2 次的情况。假设在原字符串中连续出现2 次,记这个子字符串为S,那么S 肯定包括了字符r[0], r[L], r[L*2],r[L*3], ……原创 2014-03-13 18:24:54 · 839 阅读 · 0 评论 -
poj 3415 Common Substrings 后缀数组
给两个字符串A,B,定义:S = {(i, j, k) | k≥K, A(i, k)=B(j, k)}.求有多少个三元组S。翻译一下就是枚举A中每一个长度大于等于k的子串在B中匹配,问全部成功匹配的次数,当然直接这么求得话肯定会T...这题之前用后缀自动机写过,感觉思路比后缀数组好想点...网上看到一个SA+单调栈的但由于智太硬了没看懂...然后又看到了一个神奇的做法..原帖:http://b原创 2014-03-13 21:04:56 · 652 阅读 · 0 评论 -
hdu3336 &&hdu 4552 KMP ,SAM
给一个串,求所有前缀在母串中出现的次数和。 还是利用失配函数来做,构造完失配函数,然后从末尾向前枚举,对于每个点,如果没有被访问过的话,就沿其失配路径走一遍,并且每经过一个未访问过节点,迭代层数+1(初始为0),若经过的是已经访问的节点,那么迭代层数不变;同时标记该点已访问,这个点为末尾的前缀出现的次数+当前迭代的层数,然后转移到向下一个点;对KMP的失配函数深入了解一点的话,这个思原创 2014-03-10 20:56:26 · 598 阅读 · 0 评论 -
fzu 11月赛F (2137) 奇异字符串 后缀数组
seen喜欢一种特殊的字符串,seen称这种字符串为奇异字符串。奇异字符串可以表示为AxA这种形式,A为一个任意非空字符串,只包含小写字母,x为一个不在A中出现过的小写字母。seen认为一个长度为d的奇异字符串的价值为d*d,不是奇异字符串的字符串没有价值。现给一个只包含小写字母的字符串,统计其所有子串的价值总和。一个字符串的子串是指其中连续的一段字符构成的字符串。这里相同的子串如果在原串中出现的原创 2013-11-11 12:08:23 · 920 阅读 · 0 评论 -
hdu4436 str2int 后缀自动机 SAM
给n个串,求这n个串的的不同子串表示的数字的和对2012取模...看到关于什么子串,后缀的第一反应应该就是后缀数组或者后缀自动机..10^5的规模,SA,SAM应该都能做,SAM应该好像点。把n各串用某拼接符连起来建立一个SAM,因为在SAM上跑一边可以求出这个串的所有子串,所以可以利用这个性质来求不同子串的和。先做一个拓扑排序,然后从前到后扫一遍,每个状态维护两个值cnt,sum分别表示到达该状原创 2013-10-16 15:30:10 · 902 阅读 · 0 评论 -
ural 1297 Palindrome 后缀数组
给一个长度不超过1000的由大小写字母组成的字符串,求最长回文子串。一眼看上去就是一道裸题竟然调了这么久...一开始的思路是把原串翻转接到原串后面(用分隔符隔开,并且串为加分隔符)构造后缀数组之后直接枚举相邻的sa,判断两个位置是否在不同的串里并且对应同一个位置。后来各种WA。给个数据aacdlkoiijtfidcaa ,因为只枚举相邻后缀的话,aa这个最早的回文串根本找不出来...后来的做法是求原创 2013-09-28 20:55:09 · 858 阅读 · 0 评论 -
spoj 694,705 后缀数组,后缀自动机
题意很简单,给一个字符串,求这个字符串有多少个不同的子串。这两题其实是一道,只不过694的范围是1000,705的范围是50000。写后缀数组的话,先求出sa,height这两个数组,因为每个后缀一定是一个独一无二的子串,所以可以直接把len先给ans,接下来就是找非后缀的子串,我的做法是直接循环sa,因为相邻的后缀已经是最相近的了,我要添加的就只是后缀i中从height[i]+1位开始到倒数第二原创 2013-09-27 20:56:55 · 910 阅读 · 0 评论 -
poj3261 Milk Patterns (后缀数组)
给n(n#include #include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;const int maxn=40000+40;int s[maxn],原创 2013-09-27 16:46:40 · 847 阅读 · 0 评论 -
poj1743 后缀数组
楼天成男人八题中的一道,给n个1..88的数字组成一个串S,要找出其中最长的“theme”,theme是串S的一个字串,具体的定义是 1.长度至少为5; 2.自身或者自身的变形在其他位置至少出现了一次 3.条件2中的两个字串不重叠。 变形的含义是对某个串,对他的每一位加上或减掉一个常数C,得到的新串就是原串的变形。 根据题意的匹配规则,不难想到把相邻的两个数做差得到一个新串,然后就原创 2013-09-26 22:36:00 · 768 阅读 · 0 评论 -
spoj lcs2 后缀自动机SAM
给最多10个长度不超过10W的串,求他们的最长公共子串。还是LCS的问题,只不过成了多个串求公共子串,拿来做SAM的入门题还是不错的。拿第一个串构造后缀自动机,每个状态新增两个变量n1,m1,分别是当前串匹配到当前状态时时的最长子串的长度,前k个串跑完后,在当前状态可能得到的最长公共子串长度。不好理解的一点就是每次匹配完之后,n1的值要从后向前,去更新父节点上的值,因为父节点上能接受的子串全部都是原创 2013-10-08 16:14:33 · 1104 阅读 · 0 评论 -
hdu5008 Boring String Problem 后缀数组+二分+RMQ
题意大概就是给一个串,原创 2014-09-16 15:49:20 · 742 阅读 · 0 评论