spoj1811】的更多相关文章

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 为当…
#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…
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…