题目: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]最短不公共子串——后缀自动机的更多相关文章

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

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

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

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

  3. bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)

    bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ...

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

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

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

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

  6. 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] ...

  7. BZOJ 4032: [HEOI2015]最短不公共子串 (dp*3 + SAM)

    转博客大法好 第4个子任务中,为什么只转移最近的一个位置,自己YY吧(多YY有益身体健康). #include <bits/stdc++.h> using namespace std; t ...

  8. bzoj 4032 [ HEOI 2015 ] 最短不公共子串 —— 后缀自动机+序列自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 序列自动机其实就是每个位置记录一下某字母后面第一个出现位置,为了子序列能尽量长. 对字 ...

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

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

随机推荐

  1. 配置内核 Makefile:1449: *** mixed implicit and normal rules. Stop.【转】

    本文转载自:https://blog.csdn.net/bitowang/article/details/8446494 在编译内核的时候提示Makefile:1449: *** mixed impl ...

  2. MongoDB快速入门(十三)- 聚合count、distinct和group

    1. count:     --在空集合中,count返回的数量为0.     > db.test.count()    0    --测试插入一个文档后count的返回值.    > d ...

  3. Curator的监听机制

    原生的zookeeper的监听API所实现的方法存在一些缺点,对于开发者来说后续的开发会考虑的细节比较多. Curator所实现的方法希望摒弃原声API 的不足,是开发看起来更加的简单,一些重连等操作 ...

  4. Oracle递归查询与常用分析函数

    最近学习oracle的一些知识,发现自己sql还是很薄弱,需要继续学习,现在总结一下哈. (1)oracle递归查询  start with ... connect by prior ,至于是否向上查 ...

  5. SpringBoot配置文件 application.properties详解

    SpringBoot配置文件 application.properties详解   本文转载:https://www.cnblogs.com/louby/p/8565027.html 阅读过程中若发现 ...

  6. mapreduce&GFS&bigtable learning

    之前在学习udf的时候接触到了mapreduce,感觉很酷,于是学习了一下,看了mapreduce和GFS的论文,但是没有总结,只是看了一遍 准备利用在学校的时间,学习一下bigtable,然后再认真 ...

  7. XMLHTTP.readyState

    XMLHTTP.readyState的五种就绪状态: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现 ...

  8. PHP模拟登录发送闪存

    url,post,cookie. 有这三种就可以了. 下面使用Postman模拟发送. 其中,body中是post参数,header中是cookie数据. 下面是php模拟代码. public fun ...

  9. LeetCode第[55]题(Java):Jump Game

    题目:跳跳游戏 难度:Medium 题目内容: Given an array of non-negative integers, you are initially positioned at the ...

  10. angularjs笔记(1)

    https://github.com/angular/angular.js/blob/master/src/ng/q.js 1.ng-app 指令告诉 AngularJS,<div> 元素 ...