SPOJ1811 && SPOJ1812】的更多相关文章

SPOJ1811 && SPOJ1812 LCS && LCS2 非常神奇的两道题... 题目大意: 给定n个字符串,求最长公共子串 做法1: 后缀数组: 把字符串连起来建成一个长串 二分长度 --> 最长的长度即可 二分判断条件,有一组height分组中出现了所有子串的某一后缀 做法2: 后缀树: 把字符串连起来建成一个长串 建出后缀树 只有有一个点的子树中出现了所有的子串的某一后缀 它的深度就可能成为长度 当然,要带上map 自然,现在是无法维护的. 注意到建树的…
spoj1811  给两个长度小于100000的字符串 A 和 B,求出他们的最长公共连续子串. 先将串 A 构造为 SAM ,然后用 B 按如下规则去跑自动机.用一个变量 lcs 记录当前的最长公共子串,初始化为0.设当前状态结点为 p,要匹配的字符为 c,若 go[c] 中有边,说明能够转移状态,则转移并 lcs++:若不能转移则将状态移动到 p 的 par ,如果仍然不能转移则重复该过程直到 p 回到根节点,并将 lcs 置为 0:如果在上一个过程中进入了能够转移的状态,则设 lcs 为当…
题意是求多个串的lcs. 这也是道后缀自动机的模板题.对于任意一个字符串建后缀自动机,用其他串查询就行.对于后缀自动机的每个状态要额外记匹配到当前状态的最大长度. 和spoj1811的区别在于这道题不方便后缀数组做.当然,如果不嫌很多个串用奇怪的字符连起来麻烦.判断时常数极大的话,也可以试试. 字符串总数不多,好像还真行. #include<iostream> #include<iomanip> #include<cstdio> #include<cstring&…
[传送门:SPOJ1811&BZOJ2946] 简要题意: 给出若干个字符串,求出这些字符串的最长公共子串 题解: 后缀自动机 这两道题的区别只是在于一道给出了字符串个数,一个没给,不过也差不多(代码就贴SPOJ的,因为数据范围大一点) 首先用第一个字符串构造SAM 然后处理其他的每个串在后缀自动机的每个状态能够匹配的子串最大值 然后总的来处理所有串在这个状态能够匹配的最小值 最后将所有状态都枚举一遍,求出其中的最大值就行了 参考代码: #include<cstdio> #includ…
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define maxn 500005 #define maxl 250005 using namespace std; ],fa[maxn],dist[maxn]; char s1[maxl],s2[maxl]; struct Tsegment{ ;} in…
题目:http://www.spoj.com/problems/LCS/ 题意:给两个串A和B,求这两个串的最长公共子串. 分析:其实本题用后缀数组的DC3已经能很好的解决,这里我们来说说利用后缀自动机如何实现. 对于串A和B,我们先构造出串A的后缀自动机,那么然后用B串去匹配,对于B,我们一位一位地扫描,维护一个ans值,表示从 B串的开始到B[i]的这个子串与A的最长公共子串. 假设现在到B[i-1]的最长公共子串长度为ans,然后我们来看B[i],如果当前节点有B[i]这个孩子,那么直接就…
题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=2796 把一个字符串做出后缀自动机,另一个字符串与之匹配. #include<cstdio> #include<cstring> #include<iostream> #define inf 1<<30 #define maxn 250005 using namespace std; int tot,last,root,ans,sum,n,m; c…
传送门:http://begin.lydsy.com/JudgeOnline/problem.php?id=2796 题解:后缀自动机,很裸,但是感觉对后缀自动机还不是特别理解,毕竟我太蒟蒻,等我精通了,再写对它的理解吧... 还有写这道题的时候发现数组下标又时候是负数竟然不会爆......因为这道题有大写也有小写,可我只开了26竟然A了(后面才发现)....懒得改了 代码: #include<algorithm> #include<iostream> #include<cs…
用后缀自动机实现求两个串的最长公共子串. #include <cstdio> #include <algorithm> ; char s[N]; ]; int main() { scanf("%s", s); ; s[i]; i++) { int c = s[i]-'a', u = lst; ; u && !ch[u][c]; u = f[u]) ch[u][c] = sz; int x = ch[u][c]; if(!x) {ch[u][c]…
A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also called factor, is a consecutive sequence of characters occurrences at least once in a string. Now your task i…
题解: 后缀自动机 先把A的后缀自动机建好 然后用B再上面跑 如果不能转移就跳fail 如果可以就到下一个可行状态 代码: #include<bits/stdc++.h> using namespace std; ; char b[N],a[N]; int n,m,cnt,la; struct State { ],fa,len; void init() { fa=-; len=; memset(ch,-,sizeof ch); } }T[N*]; void Extend(int c) { in…
传送门 后缀自动机模板题. 题意简述:求两个字串的最长公共子串长度. 对其中一个构建后缀自动机,用另外一个在上面跑即可. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; const int N=5e5+5; int n; char s[N]; struct SAM{ int tot,last,rt,len[N],son[N][26],link[N]; SAM(){tot=last=rt=1,len…
A string is finite sequence of characters over a non-empty finite set \(\sum\). In this problem, \(\sum\) is the set of lowercase letters. Substring, also called factor, is a consecutive sequence of characters occurrences at least once in a string. N…
A string is finite sequence of characters over a non-empty finite set \(\sum\). In this problem, \(\sum\) is the set of lowercase letters. Substring, also called factor, is a consecutive sequence of characters occurrences at least once in a string. N…
地址:http://www.spoj.com/problems/LCS2/ 题面: LCS2 - Longest Common Substring II no tags  A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also called factor, is a con…
地址:http://www.spoj.com/problems/LCS/ 题面: LCS - Longest Common Substring no tags  A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also called factor, is a consecut…
题意 A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also called factor, is a consecutive sequence of characters occurrences at least once in a string. Now your tas…
后缀自动机简单题. 其主要思路是,先对第一个字符串建立后缀自动机,把第二个串放在上面匹配, 若当前状态s有字符x的转移,直接转移len=step+1. 若当前状态s没有向字符x的转移,退回pres检查是否有转移, 若没有,则继续退回,否则转移到节点y,len=stepy+1. 以上思路主要利用的是关于pre节点的性质,由于pre节点的right集合是其子节点的right集合的并集,且max(pre)=min(s)-1. 所以从pre节点往上跳的时候,就能找到最长的后缀相同的部分的节点.(不知道这…
题目: A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also called factor, is a consecutive sequence of characters occurrences at least once in a string. Now your ta…
题目: 就不贴了吧···如题: 题解: 后缀自动机模版题:没啥好说的···· 代码: #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<ctime> #include<cctype> #include<cstring> #include<string> #include<algorithm>…
Portal,Portal to 洛谷 Description 给出\(n(n\leq10)\)个仅包含小写字母的字符串\(s_1..s_n(|s_i|\leq10^5)\),求这些字符串的最长公共子串长度. Solution 对第一个串建立SAM,然后依次跑剩下的串. 记录\(maxL[i]\)表示对于目前做过的所有串,状态\(i\)最长能匹配的长度.跑一个串\(x\)时,记录\(tmp[i]\)表示对于串\(x\),状态\(i\)最长能匹配的长度,跑完之后将\(maxL\)与\(tmp\)取…
题目链接:http://www.spoj.com/problems/LCS2/ 其实两个串的LCS会了,多个串的LCS也就差不多了. 我们先用一个串建立后缀自动机,然后其它的串在上面跑.跑的时候算出每一个位置能往左扩展的最大长度也就是LCS. 于是对于每一个状态维护mx数组,表示当前串与SAM在此状态的LCS值.对于一个状态取所有mx中的最小值,然后答案就是所有状态最小值中的最大值,证明显然. 两个串的时候不用拿一个状态更新其祖先状态,但是这里需要.SAM是一个DAG图,我们通过l数组来基数排序…
题目链接:http://www.spoj.com/problems/LCS/ 题意如题目,求两个串的最大公共子串LCS. 首先对其中一个字符串A建立SAM,然后用另一个字符串B在上面跑. 用一个变量Lcs来记录当前答案,如果能转移到下一个状态则Lcs++. 若不能转移说明需要重新选择状态,则不断地跳到当前状态的fa状态,如果发现能够转移就停下来,Lcs变为当前状态的len+1并转移到下一个可行状态. 这里很像AC自动机的fail指针的跳跃.因为fa状态是当前状态的后缀,已经被匹配过,而fa状态有…
题意是求两个字符串的lcs,两个串都只包含小写字母. 本题既可以用后缀自动机,又可以用后缀数组. 对于后缀自动机,就是一道模板题,直接对于一个字符串建后缀自动机再用另一个串查询就行. 对于后缀数组,其实也是一道模板题,但不是后缀数组的模板,而是用后缀数组求同一字符串的两个后缀的最长公共前缀的模板. 用h(x)表示排序前在第x位的后缀s1与排序后排在s1前一位的s2(记为prev(x))的最长公共前缀. 这样就会发现这些性质: 1.想要求出排序前位于k1,k2的后缀的最长公共前缀,只需要(用后缀数…
题意:给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 单词的数量<=5,单词的长度至少为1,最大为2000. 思路: #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; typedef pair<int,int> PII; typedef pair<ll,ll&…
题意:给定两个仅含小写字母的字符串,求他们最长公共子串的长度 n<=250000 思路: #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; typedef pair<int,int> PII; typedef pair<ll,ll> Pll; typedef vec…
LCS2 - Longest Common Substring II 多个字符串找最长公共子串 以其中一个串建\(SAM\),然后用其他串一个个去匹配,每次的匹配方式和两个串找\(LCS\)一样,就是要记录\(SAM\)的每个状态和当前匹配串匹配的最大值\(maxx\),这个在匹配完一个串之后需要通过\(parent\)树上传最大匹配值,同时要更新一个最小值\(minn\),来表示每个节点和当前已经匹配过的所有串能匹配上的最大值,这个需要每次匹配一个串之后和当前节点的\(maxx\)取\(min…
SAM,即Suffix Automaton,后缀自动机. 关于字符串有很多玩法,有很多算法都是围绕字符串展开的.为什么?我的理解是:相较于数字组成的序列,字母组成的序列中每个单位上元素的个数是有限的.对于有限的东西,相较于无限的东西就会具有一些奇妙的性质.最简单的,就是序列扩展成的树每个节点的儿子数是有限的.所以根据这个,从字符串Hash,到KMP,再到Suffix Array,Suffix Automaton,纷纷诞生. 后缀数组在处理字符串上相当于一把好钢,他能应付在字符串的大多数问题.那么…
题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 \(Solution\) 任何一个子串一定是某个后缀的前缀 可以将两个字符串拼在一起,中间用一个从未出现过的字符隔开,这样ht[]的最大值就是答案? 不一定,最大的ht[]可能是由同一个字符串得到的,判一下属于哪个字符串即可 //3772K 516MS //SPOJ:26M 0.11s(N=5e5)…
题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 确实比后缀数组快多了(废话→_→). \(Description\) 求两个字符串最长公共子串 \(Solution\) 对串A建立后缀自动机. A的SAM中包含A的所有子串,且根到每个节点的路径都是A的子串.如果B(的一部分?)匹配到了SAM上的某个节点,那么这便是AB的公共子串.求出这些点的max(len)即可. 用串B在SAM上逐位匹配,如果匹配,就继续沿着匹配边走: 否则,为了匹配当…