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] 表示的 ...
随机推荐
- 使用echo $? 查看命令成功执行的原理
转载于:http://blog.csdn.net/cmzsteven/article/details/49049387 在进行源代码编译,或者执行命令无法确认所执行的命令是否成功执行的情况下,我们都会 ...
- Forest Program(dfs方法---树上的环)
题意:http://acm.hdu.edu.cn/showproblem.php?pid=6736 沙漠中的每一个连通块都是一棵仙人掌:一个连通块是一棵仙人掌当且仅当连通块中不存在重边和自环,并且每一 ...
- Python与用户的交互
目录 Python与用户的交互 为什么交互 如何交互 Python2 中的交互 Python与用户的交互 为什么交互 让我们来回顾计算机的发明有何意义,计算机的发明是为了奴役计算机,解放劳动力.假设我 ...
- 关于KMP中求next数组的思考【转】
文章转自 http://www.tuicool.com/articles/yayeIbe.这是我看到关于求next数组,解释最好的一篇文章!!!!!!! KMP的next数组求法是很不容易搞清楚的一部 ...
- pb datawindow的用法
1. 使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录而不能修改,利用 Column 的 Protect 属性可以很方便的做到这一点,方法如下:将每一列的 Pr ...
- Hyperledger Fabric-sdk-java
Hyperledger Fabric-sdk-java 2018年04月18日 23:36:02 l_ricardo 阅读数 975更多 分类专栏: 区块链 java 版权声明:本文为博主原创文章 ...
- java语言中使用三元式的时候应该注意的问题
今天在项目中改领导要求的代码表现的时候发现了一个很有趣的问题. 但是的代码情况类似如下: 1 2 Integer test1 = null; System.out.println("test ...
- day12 css样式
目录 1.标签分类 2.浮动布局 3.margin塌陷 4.定位postion 5.背景图 一. 标签分类 默认在标准文档流 行内标签 span,a,em,i,strong,b,inp ...
- ubuntu - 14.04,安装Git(源代码管理工具)
在shell中执行:sudo apt-get install git-core
- python 利用pyttsx3文字转语音
# -*- coding: utf-8 -*- import pyttsx3 f = open("all.txt",'r') line = f.readline() engine ...