传送门 解题思路 首先需要预处理两个串\(nxt(i)(j)\)表示i位置之后最近的\(j\). 第一问直接对\(b\)建后缀自动机,枚举\(a\)的起点暴力匹配. 第二问枚举\(a\)的起点,\(b\)用\(nxt\)跳. 第三问\(a\)与\(b\)一起跳,\(b\)用后缀自动机,\(a\)用\(nxt\). 第四问\(a\)与\(b\)一起跳,都用\(nxt\),要加记忆化. 代码 #include<iostream> #include<cstdio> #include<…
4032: [HEOI2015]最短不公共子串 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4032 Description 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的"子串"指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的"子序列"指的是它的可以不连续的一段,例如bde是abcdef的子串,但bdd不是. 下面,给两个小写字母串A,B…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 不是 b 的子串的话就对 b 建后缀自动机,在 a 上枚举从每个位置开始的子串或者找子序列(子序列就是记录 a 的前 i 个,走到 b 的 j 状态用的最短长度),对应到自动机上看看能不能走下去就行了. 不是 b 的子序列的话就对 b 建子序列自动机?就是那个知道每个位置再填一个字符会走到哪个位置的数组.然后在 a 上枚举,看看自动机上能不能走下去就行了. #include<cstd…
bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: (1) $ A $ 的一个最短的子串,它不是 $ B $ 的子串 (2) $ A $ 的一个最短的子串,它不是 $ B $ 的子序列 (3) $ A $ 的一个最短的子序列,它不是 $ B $ 的子串 (4) $ A $ 的一个最短的子序列,它不是 $ B $ 的子序列 水题四合一,一题更比四题sa…
4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 446  Solved: 224[Submit][Status][Discuss] Description 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以不连续的一段,例如bde是abcdef的子串,但bdd不是…
题目链接 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]}…
第一.二问: 就是最小的最长公共长度+1,设f[i][j]为a匹配到i,b匹配到j,第一问的转移是f[i][j]=(a[i]==b[j]?f[i-1][j-1]+1:0),第二问的转移是f[i][j]=(a[i]==b[j]?f[i-1][j-1]+1:f[i][j-1]),注意这里更新最小公共长度的时候,如果f[i][j]==i就不能更新,因为不能从前面随便新加的字符,后面加的不能保证不相等 第三问: 对b串建SAM,设g[i]为匹配到SAM上点i时的最短长度,然后枚举a的字符,如果能转移就转…
转博客大法好 第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=='-')…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 序列自动机其实就是每个位置记录一下某字母后面第一个出现位置,为了子序列能尽量长. 对字符串B建一个后缀自动机,一个序列自动机,然后让A在上面找即可: 1.枚举A每个位置开始的子串,在SAM上走,失配就找到了: 2.枚举A子串,用B的序列自动机找失配处: 3.设 f[i][j] 表示A串前 i 个字符形成的子序列对应SAM上节点 j 时的最短子序列长度,可以转移: 4.f[i][j]…
[题意]给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短的子序列,它不是B的子序列 不存在输出-1,1<=len(A),len(B)<=2000. [算法]后缀自动机+序列自动机 [题解]虽然网上题解很多,但我总觉得这四个问题其实可以一个统一的形式来回答.因为字符串的自动机本质是相同的. 对串B建立后缀自动机来识别子串,建立序列自动机来识别子序列,从左…