BZOJ 4032: [HEOI2015]最短不公共子串 (dp*3 + SAM)
第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)的更多相关文章
- BZOJ.4032.[HEOI2015]最短不公共子串(DP 后缀自动机)
题目链接 1.求A的最短子串,它不是B的子串. 子串是连续的,对B建SAM,枚举起点,在SAM上找到第一个无法匹配点即可.O(n)用SAM能做吗..开始想错了. 2.求A的最短子串,它不是B的子序列. ...
- BZOJ 4032: [HEOI2015]最短不公共子串 后缀自动机 暴力
4032: [HEOI2015]最短不公共子串 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4032 Description 在虐各种最 ...
- BZOJ 4032: [HEOI2015]最短不公共子串
4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 446 Solved: 224[Submit][Sta ...
- bzoj 4032 [HEOI2015]最短不公共子串——后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 不是 b 的子串的话就对 b 建后缀自动机,在 a 上枚举从每个位置开始的子串或者找子 ...
- 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] ...
- BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)
传送门 解题思路 首先需要预处理两个串\(nxt(i)(j)\)表示i位置之后最近的\(j\). 第一问直接对\(b\)建后缀自动机,枚举\(a\)的起点暴力匹配. 第二问枚举\(a\)的起点,\(b ...
- BZOJ 4032 Luogu P4112 [HEOI2015]最短不公共子串 (DP、后缀自动机)
这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luog ...
- 【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)
[题意]给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短 ...
- bzoj4032: [HEOI2015]最短不公共子串(SAM+DP)
4032: [HEOI2015]最短不公共子串 题目:传送门 题解: 陈年老题良心%你赛膜爆嘎爷 当初做题...一眼SAM...结果只会两种直接DP的情况... 情况1: 直接设f[i][j] 表示的 ...
随机推荐
- bzoj 4736: 温暖会指引我们前行 (LCT 维护最大生成树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4736 题面: 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出 ...
- Jenkins学习指南
jenkinshttps://www.cnblogs.com/jimmy-xuli/p/9020825.htmlhttps://www.cnblogs.com/along21/p/10172855.h ...
- css动画(transition/transform/animation)
在开发中,一个好的用户操作界面,总会夹杂着一些动画.css用对少的代码,来给用户最佳的体验感,下面我总结了一些css动画属性的使用方法及用例代码供大家参考,在不对的地方,希望大佬直接拍砖评论. 1 t ...
- 后缀数组练习4:Life Forms
有一个细节不是特别懂,然后的话细节有点多,就是挺难发现的那一种,感谢大佬的博客 1470: 后缀数组4:Life Forms poj3294 时间限制: 1 Sec 内存限制: 128 MB提交: ...
- python中property属性的介绍及其应用
Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回. 使用property修饰的实例方法被调用时,可以把它当做实例属性一样 property的 ...
- 并不对劲的CF1237D&E:Balanced Playlist and Binary Search Trees
CF1237D Balanced Playlist 题意 有一个长度为\(n\)(\(n\leq 10^5\))的循环播放歌单,每首歌有一个优秀值\(a_i\)(\(a_i\leq 10^9\)). ...
- 【Mybatis】Mapper接口的参数处理过程
下面是一个简单的Mapper接口调用,首先同个session的getMapper方法获取Mapper的代理对象,然后通过代理对象去调用Mapper接口的方法 EmployeeMapper mapper ...
- 作业7:常用java命令(一)
一.Javac(java compiler) 1.功能:javac是一种前端编译器,负责将源代码转换为字节码. 2.例子 (1)代码 public class TestJavac { static c ...
- 【weixin】微信h5支付
一.使用场景 H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付. 主要用于触屏版的手机浏览器请求微信支付的场景.可以方便 ...
- (二)创建基于maven的javaFX项目
首先使用IDEA创建一个javaFX项目 点击finish,这就创建完成了JavaFX项目,只有将其转换为maven项目即可,如图: