题目: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. JMeter学习(二)工具简单介绍

    一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件, ...

  2. TeamViewer---Linux远程控制利器

    TeamViewer中国官网 TeamViewer用户手册 参考链接一 参考链接二 参考链接三:每天一个linux命令(41):ps命令 简介 TeamViewer是一个远程控制软件,兼容于Micro ...

  3. 落地案例|日本雅虎如何在 OpenStack 上大规模构建和运行 Kubernetes

    今天的帖子是由日本雅虎的基础设施工程团队撰写,内容是他们如何在 Kubernetes 上运行 OpenStack.这篇帖子是由日本雅虎的工程博客编译而来. 简介: 这篇帖子大致描述了日本雅虎在 Goo ...

  4. coredata 数据库升级

    在真实开发中,因为需求是不断变化的,说不定什么时候就需要往模型里添加新的字段,添加新的模型,甚至是大规模的重构:所以数据的迁移就显得尤为重要了. CoreData 中,数据迁移本质就是把旧的 SQLi ...

  5. Windows系统变量列表

    %ALLUSERSPROFILE% : 列出所有用户Profile文件位置. %APPDATA% :  列出应用程序数据的默认存放位置. %CD% :  列出当前目录. %CLIENTNAME% :  ...

  6. EditText实现输入表情

    EditText实现输入表情 一.简介 editText是TextView的子类,TextView能用的工具EditText都能用,这里就是editText利用SpannableString的Imag ...

  7. bash echo color

    原文:https://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux $ ; i ...

  8. smarty语法

    HTML中直接显示数据 <{$data}> foreach循环 <{foreach from=$data item=item key=key}> <li data-ind ...

  9. YYMMDD转YYYY-MM-DD

    date.replace(/(\d{4})(\d{2})(\d{2})/g,'$1-$2-$3');

  10. 【数据库】python访问mysql

    import MySQLdb 所有的数据库遵循相同的python database API 需要建立connection对象连接数据库,之后建立cursor对象处理数据. conn = MySQLdb ...