转博客大法好

第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=='-')flg=-flg;
for(num=0; isdigit(ch); num=num*10+ch-'0', ch=getchar());
num *= flg;
}
const int MAXN = 2005;
const int C = 26;
char A[MAXN], B[MAXN];
int f[MAXN][MAXN];
namespace task1 {
inline void solve() {
int ans = MAXN-1;
for(int i = 1; A[i]; ++i) {//字串的右端点
int mx = 0;
for(int j = 1; B[j]; ++j)
if(A[i] == B[j])
mx = max(mx, f[i][j] = f[i-1][j-1] + 1);
if(mx < i) ans = min(ans, mx+1);
}
printf("%d\n", (A[ans] && B[ans]) ? ans : -1);
}
}
namespace task2 {
inline void solve() {
int ans = MAXN-1;
for(int i = 1; A[i]; ++i) {//字串的右端点
int mx = 0;
for(int j = 1; B[j]; ++j) {
if(A[i] == B[j])
mx = max(mx, f[i][j] = f[i-1][j-1] + 1);
else mx = max(mx, f[i][j] = f[i][j-1]);
}
if(mx < i) ans = min(ans, mx+1);
}
printf("%d\n", (A[ans] && B[ans]) ? ans : -1);
}
}
namespace task3 {
int sz, last, len[MAXN<<1], link[MAXN<<1], ch[MAXN<<1][C], dp[MAXN<<1];
inline void init() {
memset(dp, 0x3f, sizeof dp);
sz = last = 0; ++sz;
len[0] = dp[0] = 0;
link[0] = -1;
//memset(ch, 0, sizeof ch);
}
inline void insert(int c) {
int cur = sz++, p;
len[cur] = len[last] + 1;
for(p = last; ~p && !ch[p][c]; p = link[p]) ch[p][c] = cur;
if(p == -1) link[cur] = 0;
else {
int q = ch[p][c];
if(len[p] + 1 == len[q]) link[cur] = q;
else {
int clone = sz++;
len[clone] = len[p] + 1;
link[clone] = link[q];
memcpy(ch[clone], ch[q], sizeof ch[q]);
for(; ~p && ch[p][c] == q; p = link[p]) ch[p][c] = clone;
link[cur] = link[q] = clone;
}
}
last = cur;
}
inline void solve() {
init();
for(int i = 1; B[i]; ++i) insert(B[i]-'a');
int ans = MAXN-1;
for(int i = 1, c; A[i]; ++i) {
c = A[i]-'a';
for(int j = 0; j < sz; ++j) {
if(ch[j][c]) dp[ch[j][c]] = min(dp[ch[j][c]], dp[j] + 1);
else ans = min(ans, dp[j] + 1);
}
}
printf("%d\n", (A[ans] && B[ans]) ? ans : -1);
}
}
namespace task4 {
int nxt[MAXN][C], pos[C], dp[MAXN];
inline void solve() {
int len = strlen(B+1);
memset(dp, 0x3f, sizeof dp);
dp[0] = 0;
for(int i = len; ~i; --i) { //要循环到0
for(int c = 0; c < 26; ++c)
nxt[i][c] = pos[c];
if(i) pos[B[i]-'a'] = i;
}
int ans = MAXN-1;
for(int i = 1, c; A[i]; ++i) {
c = A[i]-'a';
for(int j = len; ~j; --j) //要循环到0
if(nxt[j][c]) dp[nxt[j][c]] = min(dp[nxt[j][c]], dp[j] + 1);
else ans = min(ans, dp[j] + 1);
}
printf("%d\n", (A[ans] && B[ans]) ? ans : -1);
}
}
int main() {
scanf("%s%s", A+1, B+1);
task1::solve();
task2::solve();
task3::solve();
task4::solve();
}

BZOJ 4032: [HEOI2015]最短不公共子串 (dp*3 + SAM)的更多相关文章

  1. BZOJ.4032.[HEOI2015]最短不公共子串(DP 后缀自动机)

    题目链接 1.求A的最短子串,它不是B的子串. 子串是连续的,对B建SAM,枚举起点,在SAM上找到第一个无法匹配点即可.O(n)用SAM能做吗..开始想错了. 2.求A的最短子串,它不是B的子序列. ...

  2. BZOJ 4032: [HEOI2015]最短不公共子串 后缀自动机 暴力

    4032: [HEOI2015]最短不公共子串 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4032 Description 在虐各种最 ...

  3. BZOJ 4032: [HEOI2015]最短不公共子串

    4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 446  Solved: 224[Submit][Sta ...

  4. bzoj 4032 [HEOI2015]最短不公共子串——后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 不是 b 的子串的话就对 b 建后缀自动机,在 a 上枚举从每个位置开始的子串或者找子 ...

  5. bzoj 4032: [HEOI2015]最短不公共子串【dp+SAM】

    第一.二问: 就是最小的最长公共长度+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] ...

  6. BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)

    传送门 解题思路 首先需要预处理两个串\(nxt(i)(j)\)表示i位置之后最近的\(j\). 第一问直接对\(b\)建后缀自动机,枚举\(a\)的起点暴力匹配. 第二问枚举\(a\)的起点,\(b ...

  7. BZOJ 4032 Luogu P4112 [HEOI2015]最短不公共子串 (DP、后缀自动机)

    这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luog ...

  8. 【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)

    [题意]给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短 ...

  9. bzoj4032: [HEOI2015]最短不公共子串(SAM+DP)

    4032: [HEOI2015]最短不公共子串 题目:传送门 题解: 陈年老题良心%你赛膜爆嘎爷 当初做题...一眼SAM...结果只会两种直接DP的情况... 情况1: 直接设f[i][j] 表示的 ...

随机推荐

  1. linux的route

    参考: https://blog.csdn.net/u011857683/article/details/83795435 老男孩: https://blog.51cto.com/oldboy/974 ...

  2. [bzoj3887][Usaco2015 Jan]Grass Cownoisseur_trajan_拓扑排序_拓扑序dp

    [Usaco2015 Jan]Grass Cownoisseur 题目大意:给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在 ...

  3. Infix to Postfix Expression

    Example : Infix : (A+B) * (C-D) ) Postfix: AB+CD-* 算法: 1. Scan the infix expression from left to rig ...

  4. mysql CPU太高排查办法

    [1]问题描述 首先,查看top,下图来自网络 为什么会有%CPU 375??? 还可以超过100%的? 这是因为,有多核CPU.如图,top后,按数字1,即可出现下图. [2]排查办法(当前CPU爆 ...

  5. (5.15)mysql高可用系列——MHA实践

    关键词:MHA,mysql mha [1]需求 采用mysql技术,实现MHA高可用主从环境,预计未来数据量几百G MHA概念参考:MYSQL高可用技术概述 [2]环境技术架构 [2.1]MHA简介 ...

  6. 跨域以及WebService对跨域的支持

    无耻收藏该博主的成果啦!https://www.cnblogs.com/yangecnu/p/introduce-cross-domain.html 通过域验证访问WebService:https:/ ...

  7. FFmpeg4.0笔记:封装ffmpeg的解封装功能类CDemux

    Github https://github.com/gongluck/FFmpeg4.0-study/tree/master/Cff CDemux.h /*********************** ...

  8. pb datawindow 类型

    DataWindow.Processing 判断 DataWindow 对象的类型 可用 DataWindow.Processing 判断 DataWindow 对象的类型,dw的类型如下:     ...

  9. ArrayList,LinkedList,Vector区别.TreeSet,TreeSet,LinkedHashSet区别

    ArrayList: 基于数组的数据结构,地址连续,一旦数据保存好了,查询效率比较高,但是因为其地址连续,所以增删数据需要移动数据,影响速度 内部数组长度默认为10,当需要扩容时,数组长度按1.5倍增 ...

  10. 深入探讨java的类加载器

    类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行.类加载器从 JDK 1.0 就出现了,最初是为了满足 Ja ...