SA
Nightmare丶
登高必自卑,行远必自迩
展开
-
PowerOJ 2904: kmlver的子串plus
题意:kmlver有一个字符串S, 该字符串仅由小写字母组成,你需要分别回答Q次询问,每次询问由4个整数组成:l1,r1,l2,r2(1≤l1≤r1≤∣S∣,1≤l2≤r2≤∣S∣)l1, r1, l2, r2 (1 ≤ l1 ≤ r1 ≤ |S|, 1 ≤ l2 ≤ r2 ≤ |S|)l1,r1,l2,r2(1≤l1≤r1≤∣S∣,1≤l2≤r2≤∣S∣),你需要统计子串Sl1S_{l_1}Sl1Sl1+1S_{l_1+1}Sl1+1Sl1+2S_{l_1+2}Sl1+2…Sr1S_{r1}原创 2020-10-27 19:02:08 · 176 阅读 · 0 评论 -
Stammering Aliens
题意:输入一个k,和一个字符串,询问是否存在出现次数>=k的子串,若存在,输出长度最长的子串和这些子串中起始下标最靠右的(下标从0开始),否则输出"none";例如:3baaaababababbababbab其中babab出现了3次,长度为5,起始下标分别出现在5,7,12,输出最靠右的也就是12题解:先用SA对所有后缀排序,由于一段区间的LCP表示的子串一定出现在每个后缀里...原创 2020-02-14 17:15:21 · 122 阅读 · 0 评论 -
BZOJ 4892: [Tjoi2017]DNA(SA+RMQ / SAM)
Description加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列S,任意修改其中不超过3个碱基,依然能够表现出吃藕的性状。现在研究人员想知道这个基因在DNA链S0上的位置。所以你需要统计在一个表现出吃藕性状的人的DNA序列S0上,有多少个连续子串可能是该基因,即有多少个S0的连续子串修改小于等于三个...原创 2020-01-12 23:39:41 · 228 阅读 · 2 评论 -
BZOJ 4698: Sdoi2008 Sandy的卡片(SA+二分)
DescriptionSandy和Sue的热衷于收集干脆面中的卡片。然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型。每一张卡片都由一些数字进行标记,第i张卡片的序列长度为Mi,要想兑换人物模型,首先必须要集够N张卡片,对于这N张卡片,如果他们都有一个相同的子串长度为k,则可以兑换一个等级为k的人物模型。相同的定义为:两个子串长度相同且一个串的...原创 2020-01-12 20:38:53 · 115 阅读 · 0 评论 -
P5028 Annihilate(SA)
题目描述黑暗之主的蜈蚣几乎可以毁灭一切,因此小正方形陷入了苦战……小正方形现在需要减弱黑暗之主的攻击。一个黑暗之主的攻击可以用一个仅有小写字母的字符串表示。现在黑暗之主向小正方形发动了若干攻击,对于两个攻击,小正方形能选出它们最长的公共子串,并把这一段消除。现在小正方形想要知道,对于任意两个黑暗之主的攻击,它们的最长公共子串长度是多少,你能帮帮它吗?输入格式第一行为一个整数 n,表示...原创 2020-01-12 20:03:38 · 157 阅读 · 0 评论 -
BZOJ 2946.公共串(SA+二分/SAM)
题目描述给出几个由小写字母构成的单词,求它们最长的公共子串的长度。输入格式文件的第一行是整数 n,1≤n≤51\le n \le 51≤n≤5,表示单词的数量。接下来nn行每行一个单词,只由小写字母组成,单词的长度至少为1,最大为2000。输出格式仅一行,一个整数,最长公共子串的长度。题解:把所有串接在一起,中间用其他符号连接,然后二分答案,判断一段中的LCP是否来自所有串即可...原创 2020-01-12 17:16:51 · 165 阅读 · 0 评论 -
LOJ 6198. 谢特(后缀数组+可持久化Trie)
题目链接题意:定义这个字符串以第i个字符开头的后缀为后缀i(编号从1开始),每个后缀i都有一个wiw_iwi,同时定义两个后缀i,j(i≠j)的贡献为它们的最长公共前缀长度加上它们权值的异或和,也就是LCP(i,j)+(wiLCP(i,j)+(w_iLCP(i,j)+(wi xorxorxor wj)w_j)wj),求出这个字符串的所有后缀两两之间贡献的最大值。题解:首先两个后缀的L...原创 2019-12-10 15:19:10 · 294 阅读 · 0 评论 -
Substrings POJ - 1226(后缀数组+二分)
ProblemYou are given a number of case-sensitive strings of alphabetic characters, find the largest string X, such that either X, or its inverse can be found as a substring of any of the given strings...原创 2019-11-29 00:33:17 · 98 阅读 · 0 评论 -
E - Locker Room Gym - 101954E(后缀数组+二分)
题目链接题解:我们直接开2倍长度跑SA就好了,因为我们要找一个满足能标记完n个字符的排名最小的长度为k的子串,所以我们可以二分排名check一下长度是否大于等于n就好了。AC代码:#include<bits/stdc++.h>using namespace std;const int MAXN = 1e6+50;char ss[MAXN]; int s[MAXN];i...原创 2019-11-27 21:41:53 · 227 阅读 · 0 评论 -
P3181 [HAOI2016]找相同字符(后缀数组+单调栈)
题意:给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。两个方案不同当且仅当这两个子串中有一个位置不同。题解:首先我们想到从A,B两个串中选择两个子串相同肯定不好选,但我们可以用容斥,先计算出A和B拼接在一起的总的子串相同的方案数,再减去两个都在A中选,和两个都在B中选的情况,求解方案数时可以用单调栈求出。单调栈:处理到 排名为 i的串的时候,如果栈顶的heig...原创 2019-11-23 00:34:32 · 142 阅读 · 0 评论 -
SPOJ - 687 REPEATS(后缀数组)
题意:求重复次数最多的连续重复子串的长度题解:其实上一篇已经写过这种题【POJ-3693】了,只不过那题最后是要求解最后的串,这题只需要求出循环次数即可。一样的思路,枚举重复长度为L,就有rk[pos]rk[pos]rk[pos]和rk[pos+L]rk[pos+L]rk[pos+L]这两个串,pos为枚举的L的倍数,即rk[k∗L]rk[k*L]rk[k∗L]和rk[(k+1)∗L)]r...原创 2019-11-23 00:12:41 · 156 阅读 · 0 评论 -
POJ 3693 Maximum repetition substring(后缀数组)
题意:求重复次数最多的连续子串。题解:这是网上论文写的,我跟着这个学习的,看这个应该比我讲的好多了= =AC代码:#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define rint register intconst int MAXN = ...原创 2019-11-22 23:41:57 · 102 阅读 · 0 评论 -
POJ-1743 男人八题-第七题-后缀数组
题意:给你一个长度为n(1<=n<=20000)的数字串。如果一个串在母串出现的次数大于一次那么这个串就是母串的重复子串。子串的每个位置同时加上一个数字重复出现在另一个位置也算重复。现在问这个母串最长的不相交即没有重复元素的重复子串的最大长度。题解:对于可相交的最长重复子串。可以狠轻松的想到后缀数组。对于题目所给的加上一个数字重复的情况。可以令s[i]=s[i+1]-s[i]...原创 2019-11-22 23:21:24 · 127 阅读 · 0 评论 -
POJ 3415 Common Substrings(后缀数组+单调栈)
题意:求两个字符串长度不小于k的公共子串个数题解:计算A的某个后缀与B的某个后缀的最长公共前缀长度,如果长度L大于k,应加上L-k+1组还是将两个字符串用连起来,中间用分隔符隔开,然后利用后缀数组求出h数组分组,若某组内的h都是大于等于k的,那么扫描一遍遇到一个B的后缀就和之前的A后缀进行统计,这种做法肯定是不行的,因为已经是O(n2)O(n^2)O(n2)由后缀数组性质容易发现两个后缀...原创 2019-11-22 18:44:44 · 117 阅读 · 0 评论 -
HDU 3518 Boring counting(后缀数组)
题意:求出不重叠切出现次数超过两次的子串个数题解:后缀数组分组后,判断每组出现的sa最大值和最小值之差是否是大于k就好了,k通过枚举即可AC代码:#include<bits/stdc++.h>using namespace std;const int INF = 0x3f3f3f3f;const int MAXN = 2000+50;char s[MAXN];in...原创 2019-11-22 00:48:26 · 161 阅读 · 0 评论 -
SPOJ 220 PHRASES - Relevant Phrases of Annihilation(后缀数组)
题意:询问在每个字符串都出现两次且不重叠的最长子串的长度。题解:利用后缀数组分组的性质,求出每一组有没有满足条件的子串,然后二分答案,其中在原字符串中出现两次可以用这个字符串里max(sa[i])−min(sa[i])max(sa[i])-min(sa[i])max(sa[i])−min(sa[i])解决,不重叠就是判断这个maxmaxmax是不是大于等于mid,最后判断是否是每个字符串都满...原创 2019-11-22 00:22:10 · 105 阅读 · 0 评论 -
POJ 3294 Life Forms(后缀数组)
题意:有n个字符串,询问找出一个最长的子串在一半以上的字符串中出现过,若没有,则输出-1题解:把每个字符串链接在一起,中间加上分隔符,计算出h数组,利用h数组将后缀分组的性质,我们就可以二分长度,然后再判断每一组的前缀是否出现过一半以上即可。AC代码:#include<iostream>#include<cstring>#include<cstdio&...原创 2019-11-21 22:52:16 · 123 阅读 · 0 评论 -
BZOJ 3879: SvT(后缀数组+单调栈)
题目链接题解:求出后缀数组,然后用单调栈求出该区间作为区间最小值时的左右边界即可。AC代码:#include<bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 5e5+50;int n,Q,m=26;int rk[MAXN],sa[MAXN],y[MAXN],c[MAXN],...原创 2019-11-16 02:45:18 · 111 阅读 · 0 评论 -
[2019CCPC网络赛][hdu6704] K-th occurrence
Problem DescriptionYou are given a string S consisting of only lowercase english letters and some queries.For each query (l,r,k)(l,r,k)(l,r,k), please output the starting position of the k−thk-thk−t...原创 2019-11-13 15:32:54 · 181 阅读 · 0 评论 -
P4248 [AHOI2013]差异(SAM/SA)
题意:给出一个长度为nnn的字符串,求 ∑1<=i<j<=nlen(Ti)+len(Tj)−2∗lcp(Ti,Tj)\sum_{1<=i<j<=n} len(Ti)+len(Tj)−2∗lcp(Ti,Tj)1<=i<j<=n∑len(Ti)+len(Tj)−2∗lcp(Ti,Tj)题解:方法一:考虑把原串翻转过来,那么要求的就是所有前...原创 2019-11-01 01:37:10 · 219 阅读 · 0 评论