【Luogu】P3856公共子串(DP)】的更多相关文章

题目链接 DP.设last[i][j]是第i个串字符'j'所在的最后的位置,f[i][j][k]是第一个串匹配到i,第二个串匹配到j,第三个串匹配到k,最多的公共子串数. 那么我们三重循环i.j.k,每次更新last数组的值. 然后在三重循环内部再加一重循环从'a'到'z',枚举公共子串的最后一个字符是什么. 然后在last里面找到这三个字符最后出现在什么位置,记为nms. 于是f[i][j][k]=f[n-1][m-1][s-1]+1. 最后输出答案即可. #include<cstring>…
这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luogu.org/problemnew/show/P4112 题解: Task 1 \(O(n^2)\)做法无数(也有不用SAM的\(O(n^2)\)做法),我讲一下我的做法. 直接对B串建后缀自动机,用A串在上面跑,而且是像求两个串的最长公共子串那样跑,如果遇到失配了就拿当前长度\(+1\)更新答案.但…
public static int lcs(String str1, String str2) { int len1 = str1.length(); int len2 = str2.length(); int c[][] = new int[len1+1][len2+1]; for (int i = 0; i <= len1; i++) { for( int j = 0; j <= len2; j++) { if(i == 0 || j == 0) { c[i][j] = 0; } else…
题目链接 1.求A的最短子串,它不是B的子串. 子串是连续的,对B建SAM,枚举起点,在SAM上找到第一个无法匹配点即可.O(n)用SAM能做吗..开始想错了. 2.求A的最短子串,它不是B的子序列. 子序列...直接建SAM没啥用.考虑A[i]和上一位A[i-1],用f[i][j]表示到A[i]匹配到B[j]时连续的A的子串长度,如果A[i]==B[j],则f[i][j]=max{f[i-1][k]+1}(k<j). 是取max啊,因为B会尽可能匹配.枚举完B[n]后且max{f[i][k]}…
转博客大法好 第4个子任务中,为什么只转移最近的一个位置,自己YY吧(多YY有益身体健康). #include <bits/stdc++.h> using namespace std; typedef long long LL; template<class T>inline void read(T &num) { register char ch; register int flg = 1; while(!isdigit(ch=getchar()))if(ch=='-')…
//Accepted 204 KB 891 ms //dp最长公共子串 //dp[i][j]=max(dp[i-1][j],dp[i][j-1]) //dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1) (s1[i]==s2[j]) #include <cstdio> #include <cstring> #include <iostream> using namespace std; ; ][imax_n]; char s1[imax_n];…
bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: (1) $ A $ 的一个最短的子串,它不是 $ B $ 的子串 (2) $ A $ 的一个最短的子串,它不是 $ B $ 的子序列 (3) $ A $ 的一个最短的子序列,它不是 $ B $ 的子串 (4) $ A $ 的一个最短的子序列,它不是 $ B $ 的子序列 水题四合一,一题更比四题sa…
1. 两者区别 约定:在本文中用 LCStr 表示最长公共子串(Longest Common Substring),LCSeq 表示最长公共子序列(Longest Common Subsequence). 子串要求在原字符串中是连续的,而子序列则没有要求.例如: 字符串 s1=abcde,s2=ade,则 LCStr=de,LCSeq=ade. 2. 求最长公共子串(LCStr) 算法描述:构建如下图的矩阵dp[][],当s1[i] == s2[j] 的时候,dp[i][j]=1:最后矩阵中斜对…
在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之——被它们虐. 操作一:对A,B分别建SAM,暴力BFS. 操作二:对B建序列自动机或SAM,A在上面暴力匹配. 操作三:对A,B建序列自动机,暴力匹配. 操作四:对B建序列自动机,在自动机上DP. 上面的我一句也看不懂,对不起我重说一遍. 操作一:对B的所有后缀建Trie,A在上面暴力跑.$O(n^2)$ 操作二:枚举A的子串,在B上暴力匹配.$O(n^2)$ 操作三:在B的每个点上挂一个原本没有的叶子,将从根到这个叶子的路径…
4032: [HEOI2015]最短不公共子串 题目:传送门 题解: 陈年老题良心%你赛膜爆嘎爷 当初做题...一眼SAM...结果只会两种直接DP的情况... 情况1: 直接设f[i][j] 表示的是a串的第i个位置和b串的第j个位置开始的最长公共前缀(灵感来源于SA).然后就枚举开头直接瞎搞啊... 情况2: 定义一个last[i][j] 表示b串的位置i后面的第一个字符j,贪心的思想直接做,匹配不到位置就直接记录答案了嘛 情况3: 因为是在b串当中找子串,a中找子序列,那就考虑对b建SAM…