摘要:
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=4622 【题目大意】 给出一个长度不超过2000的字符串,有不超过10000个询问,问【L,R】子串中出现的子串数目,相同子串不可重复计数。 【题解】 考虑到字符串长度只有两千,我们对每个位置往后建立 阅读全文
摘要:
【题目链接】 http://www.spoj.com/problems/SUBLEX/ 【题目大意】 给出一个字符串,求其字典序排名第k的子串 【题解】 求出sam上每个节点被经过的次数,然后采用权值线段树上查找第k大数类似的方法, 每次确定查找范围,进入相应的子树,同时输出路径上的点即可。 【代码 阅读全文
摘要:
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=4436 【题目大意】 给出一些字符串,由0~9组成,求出所有不同子串的和。 【题解】 将所有字符串添加拼接符10连接在一起建立自动机, 从起点开始遍历所有节点,就能计算所有的子串和了。注意转移的时候只 阅读全文
摘要:
【题目链接】 http://www.spoj.com/problems/LCS2/ 【题目大意】 求n个串的最长公共子串 【题解】 对一个串建立后缀自动机,剩余的串在上面跑,保存匹配每个状态的最小值, 取最小值中的最大值即可。由于跑的地方只记录了匹配结尾的状态, 所以还需要更新parent树上的状态 阅读全文
摘要:
【题目链接】 http://codeforces.com/contest/235/problem/C 【题目大意】 给出一个字符串,给出一些子串,问每个子串分别在母串中圆环匹配的次数,圆环匹配的意思是将该子串拆成两段再首位交换相接的串和母串匹配,比如aaab变成baaa,abaa,aaba再进行匹配 阅读全文
摘要:
【题目链接】 http://acm.timus.ru/problem.aspx?num=1297 【题目大意】 求最长回文子串,并输出这个串。 【题解】 我们将原串倒置得到一个新的串,加一个拼接符将新串拼在原串的后面, 那么枚举对称的中心点, 在两个串在组合成的串的对应位置的后缀的最长公共前缀 就是 阅读全文
摘要:
【题目链接】 http://poj.org/problem?id=2774 【题目大意】 求最长公共子串 【题解】 将两个串中间嵌一个字符相连,求一遍后缀数组 如果排名相邻的两个后缀的开端是分属于两个串的, 那么他们的最长公共前缀就可以用来更新答案 【代码】 阅读全文
摘要:
【题目链接】 http://www.spoj.com/problems/REPEATS/en/ 【题目大意】 求重复次数最多的连续重复子串的长度。 【题解】 考虑错位匹配,设重复部分长度为l,记s[i]和s[i+l]前缀匹配得到的最长长度为r,枚举所有的l和i,得到r,那么答案就是r/l+1的最大值 阅读全文
摘要:
【题目链接】 poj.org/problem?id=3693 【题目大意】 求一个串重复次数最多的连续重复子串并输出,要求字典序最小。 【题解】 考虑错位匹配,设重复部分长度为l,记s[i]和s[i+l]前缀匹配得到的最长长度为r, 枚举所有的l和i,得到r,那么答案就是r/l+1的最大值。 计算任 阅读全文
摘要:
【题目链接】 http://www.spoj.pl/problems/PHRASES/ 【题目大意】 求在每个字符串中出现至少两次的最长的子串 【题解】 注意到这么几个关键点:最长,至少两次,每个字符串。 首先对于最长这个条件,我们可以想到二分答案, 然后利用后缀数组所求得的三个数组判断是否满足条件 阅读全文
摘要:
【题目链接】 http://poj.org/problem?id=3415 【题目大意】 求出两个字符串长度大于k的公共子串的数目。 【题解】 首先,很容易想到O(n2)的算法,将A串和B串加拼接符相连, 做一遍后缀数组,把分别属于A和B的所有后缀匹配,LCP-k+1就是对答案的贡献, 但是在这个基 阅读全文
摘要:
【题目链接】http://www.lydsy.com/JudgeOnline/problem.php?id=1717 【题目大意】 求一个最长的串,使得其在母串中出现的次数达到要求 【题解】 二分答案,利用后缀数组求出的height数组进行检验 【代码】 阅读全文
摘要:
【题目链接】 http://poj.org/problem?id=3261 【题目大意】 求最长可允许重叠的出现次数不小于k的子串。 【题解】 对原串做一遍后缀数组,二分子串长度x,将前缀相同长度超过x的后缀分组, 如果存在一个大小不小于k的分组,则说明答案可行,分治得到最大可行解就是答案。 【代码 阅读全文
摘要:
【题目链接】 http://poj.org/problem?id=3294 【题目大意】 求出在至少在一半字符串中出现的最长子串。 如果有多个符合的答案,请按照字典序输出。 【题解】 将所有的字符串通过不同的拼接符相连,作一次后缀数组, 二分答案的长度,然后在h数组中分组,判断是否可行, 按照sa扫 阅读全文
摘要:
【题目链接】 http://poj.org/problem?id=1743 【题目大意】 给出一首曲子的曲谱,上面的音符用不大于88的数字表示, 现在请你确定它主旋律的长度,主旋律指的是出现超过一次, 并且长度不小于5的最长的曲段,主旋律出现的时候并不是完全一样的, 可能经过了升调或者降调,也就是说 阅读全文
摘要:
【题目链接】 http://www.spoj.com/problems/SUBST1/ 【题目大意】 给出一个串,求出不相同的子串的个数。 【题解】 对原串做一遍后缀数组,按照后缀的名次进行遍历, 每个后缀对答案的贡献为n-sa[i]+1-h[i], 因为排名相邻的后缀一定是公共前缀最长的, 那么就 阅读全文
摘要:
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5769 【题目大意】 在一个串中求出包含字母的子串个数, 只要存在一个字符不相等的子串即可视为不同的子串。 【题解】 因为要求存在字符不相等因此我们可以利用后缀数组统计, 后缀数组的h数组可以记录前后 阅读全文
摘要:
【题目链接】 http://poj.org/problem?id=1226 【题目大意】 求在每个给出字符串中出现的最长子串的长度,字符串在出现的时候可以是倒置的。 【题解】 我们将每个字符串倒置,用拼接符和原串拼接,然后将所有通过这种方式得到的字符串拼接,做后缀数组,因为求最长子串,所以我们考虑二 阅读全文
摘要:
【题目链接】 http://acm.hust.edu.cn/vjudge/problem/27647 【题目大意】 给出一个字符串,要求在其后面添加最少的字符数,使得其成为一个回文串。并输出这个回文串。 【题解】 用拼接符将原字符串倒序相接,做一遍后缀数组,查询两串相应位置的LCP就是以该点为中心的 阅读全文
摘要:
【题目链接】 http://poj.org/problem?id=3581 【题目大意】 给出一个数列,将这个数列分成三段,每段分别翻转,使得其字典序最小,输出翻转后的数列。 【题解】 首先,第一个翻转点就是翻转后数列的最小后缀,注意由于一定要分成三段,则至少要剩下两个元素。难点主要是如何处理第二个 阅读全文