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的一个最短 ...
随机推荐
- JMeter学习(二)工具简单介绍
一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件, ...
- TeamViewer---Linux远程控制利器
TeamViewer中国官网 TeamViewer用户手册 参考链接一 参考链接二 参考链接三:每天一个linux命令(41):ps命令 简介 TeamViewer是一个远程控制软件,兼容于Micro ...
- 落地案例|日本雅虎如何在 OpenStack 上大规模构建和运行 Kubernetes
今天的帖子是由日本雅虎的基础设施工程团队撰写,内容是他们如何在 Kubernetes 上运行 OpenStack.这篇帖子是由日本雅虎的工程博客编译而来. 简介: 这篇帖子大致描述了日本雅虎在 Goo ...
- coredata 数据库升级
在真实开发中,因为需求是不断变化的,说不定什么时候就需要往模型里添加新的字段,添加新的模型,甚至是大规模的重构:所以数据的迁移就显得尤为重要了. CoreData 中,数据迁移本质就是把旧的 SQLi ...
- Windows系统变量列表
%ALLUSERSPROFILE% : 列出所有用户Profile文件位置. %APPDATA% : 列出应用程序数据的默认存放位置. %CD% : 列出当前目录. %CLIENTNAME% : ...
- EditText实现输入表情
EditText实现输入表情 一.简介 editText是TextView的子类,TextView能用的工具EditText都能用,这里就是editText利用SpannableString的Imag ...
- bash echo color
原文:https://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux $ ; i ...
- smarty语法
HTML中直接显示数据 <{$data}> foreach循环 <{foreach from=$data item=item key=key}> <li data-ind ...
- YYMMDD转YYYY-MM-DD
date.replace(/(\d{4})(\d{2})(\d{2})/g,'$1-$2-$3');
- 【数据库】python访问mysql
import MySQLdb 所有的数据库遵循相同的python database API 需要建立connection对象连接数据库,之后建立cursor对象处理数据. conn = MySQLdb ...