bzoj 4032 [HEOI2015]最短不公共子串——后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032
不是 b 的子串的话就对 b 建后缀自动机,在 a 上枚举从每个位置开始的子串或者找子序列(子序列就是记录 a 的前 i 个,走到 b 的 j 状态用的最短长度),对应到自动机上看看能不能走下去就行了。
不是 b 的子序列的话就对 b 建子序列自动机?就是那个知道每个位置再填一个字符会走到哪个位置的数组。然后在 a 上枚举,看看自动机上能不能走下去就行了。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,K=;
char a[N],b[N];
int n,m,cnt=,lst=,go[M][K],fa[M],l[M],nxt[N][K],lt[K];
int dp[N][M];//M//int
int Mn(int a,int b){return a<b?a:b;}
void add(int w)
{
int p=lst,np=++cnt;lst=np;l[np]=l[p]+;
for(;p&&!go[p][w];p=fa[p])go[p][w]=np;
if(!p)fa[np]=;
else
{
int q=go[p][w];
if(l[q]==l[p]+)fa[np]=q;
else
{
int nq=++cnt;l[nq]=l[p]+;
fa[nq]=fa[q];fa[q]=nq;fa[np]=nq;
memcpy(go[nq],go[q],sizeof go[q]);
for(;go[p][w]==q;p=fa[p])go[p][w]=nq;
}
}
}
void solve1()
{
int ans=n+;
for(int i=;i<=n;i++)
{
int cr=;
for(int j=i;j<=n;j++)
{
if(!go[cr][a[j]-'a'+])
{ans=Mn(ans,j-i+);break;}
cr=go[cr][a[j]-'a'+];
}
}
printf("%d\n",ans>n?-:ans);
}
void solve2()
{
int ans=n+;
for(int t=;t<=n;t++)
{
int cr=;
for(int i=t;i<=n;i++)
{
int d=a[i]-'a'+;
if(nxt[cr][d])cr=nxt[cr][d];
else {ans=Mn(ans,i-t+);break;}
}
}
printf("%d\n",ans>n?-:ans);
}
void solve3()
{
memset(dp,0x3f,sizeof dp);
dp[][]=; int ans=n+;
for(int i=;i<=n;i++)
{
int d=a[i]-'a'+;
for(int j=;j<=cnt;j++)
if(dp[i-][j]<=n)
{
dp[i][j]=Mn(dp[i][j],dp[i-][j]);
if(!go[j][d])ans=Mn(ans,dp[i-][j]+);
else dp[i][go[j][d]]=Mn(dp[i][go[j][d]],dp[i-][j]+);
}
}
printf("%d\n",ans>n?-:ans);
}
void solve4()
{
memset(dp,0x3f,sizeof dp);
dp[][]=; int ans=n+;
for(int i=;i<=n;i++)
{
int d=a[i]-'a'+;
for(int j=;j<=m;j++)
if(dp[i-][j]<=n)
{
dp[i][j]=Mn(dp[i][j],dp[i-][j]);
if(!nxt[j][d])ans=Mn(ans,dp[i-][j]+);
else dp[i][nxt[j][d]]=Mn(dp[i][nxt[j][d]],dp[i-][j]+);
}
}
printf("%d\n",ans>n?-:ans);
}
int main()
{
scanf("%s",a+);scanf("%s",b+);
n=strlen(a+);m=strlen(b+);
for(int i=;i<=m;i++)add(b[i]-'a'+);
for(int i=m;i>=;i--)
{
for(int j=;j<=;j++)
nxt[i][j]=lt[j];
lt[b[i]-'a'+]=i;
}
solve1();solve2();
solve3();solve4();
return ;
}
bzoj 4032 [HEOI2015]最短不公共子串——后缀自动机的更多相关文章
- BZOJ 4032: [HEOI2015]最短不公共子串 后缀自动机 暴力
4032: [HEOI2015]最短不公共子串 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4032 Description 在虐各种最 ...
- BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)
传送门 解题思路 首先需要预处理两个串\(nxt(i)(j)\)表示i位置之后最近的\(j\). 第一问直接对\(b\)建后缀自动机,枚举\(a\)的起点暴力匹配. 第二问枚举\(a\)的起点,\(b ...
- bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)
bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ...
- BZOJ 4032: [HEOI2015]最短不公共子串
4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 446 Solved: 224[Submit][Sta ...
- BZOJ.4032.[HEOI2015]最短不公共子串(DP 后缀自动机)
题目链接 1.求A的最短子串,它不是B的子串. 子串是连续的,对B建SAM,枚举起点,在SAM上找到第一个无法匹配点即可.O(n)用SAM能做吗..开始想错了. 2.求A的最短子串,它不是B的子序列. ...
- 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]最短不公共子串 (dp*3 + SAM)
转博客大法好 第4个子任务中,为什么只转移最近的一个位置,自己YY吧(多YY有益身体健康). #include <bits/stdc++.h> using namespace std; t ...
- bzoj 4032 [ HEOI 2015 ] 最短不公共子串 —— 后缀自动机+序列自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 序列自动机其实就是每个位置记录一下某字母后面第一个出现位置,为了子序列能尽量长. 对字 ...
- 【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)
[题意]给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短 ...
随机推荐
- 配置内核 Makefile:1449: *** mixed implicit and normal rules. Stop.【转】
本文转载自:https://blog.csdn.net/bitowang/article/details/8446494 在编译内核的时候提示Makefile:1449: *** mixed impl ...
- MongoDB快速入门(十三)- 聚合count、distinct和group
1. count: --在空集合中,count返回的数量为0. > db.test.count() 0 --测试插入一个文档后count的返回值. > d ...
- Curator的监听机制
原生的zookeeper的监听API所实现的方法存在一些缺点,对于开发者来说后续的开发会考虑的细节比较多. Curator所实现的方法希望摒弃原声API 的不足,是开发看起来更加的简单,一些重连等操作 ...
- Oracle递归查询与常用分析函数
最近学习oracle的一些知识,发现自己sql还是很薄弱,需要继续学习,现在总结一下哈. (1)oracle递归查询 start with ... connect by prior ,至于是否向上查 ...
- SpringBoot配置文件 application.properties详解
SpringBoot配置文件 application.properties详解 本文转载:https://www.cnblogs.com/louby/p/8565027.html 阅读过程中若发现 ...
- mapreduce&GFS&bigtable learning
之前在学习udf的时候接触到了mapreduce,感觉很酷,于是学习了一下,看了mapreduce和GFS的论文,但是没有总结,只是看了一遍 准备利用在学校的时间,学习一下bigtable,然后再认真 ...
- XMLHTTP.readyState
XMLHTTP.readyState的五种就绪状态: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现 ...
- PHP模拟登录发送闪存
url,post,cookie. 有这三种就可以了. 下面使用Postman模拟发送. 其中,body中是post参数,header中是cookie数据. 下面是php模拟代码. public fun ...
- LeetCode第[55]题(Java):Jump Game
题目:跳跳游戏 难度:Medium 题目内容: Given an array of non-negative integers, you are initially positioned at the ...
- angularjs笔记(1)
https://github.com/angular/angular.js/blob/master/src/ng/q.js 1.ng-app 指令告诉 AngularJS,<div> 元素 ...