给定两个字符串\(A\)和\(B\),我们需要找出一个串,其在\(A\)中出现且不在\(B\)中出现,这个串为子串或者子序列,求在每种情况下,该串的最短长度。

考虑到后缀自动机可以识别一个字符串的所有子串,序列自动机可以识别一个字符串的所有子序列。

那么我们直接对\(A\)和\(B\)两个字符串建出相应的自动机,在两个自动机上同时进行\(bfs\),当发现存在一个串在\(A\)上可识别,在\(B\)上无法识别,那么就找到了答案,若\(bfs\)整个过程结束了,说明没有符合要求的答案,直接返回\(-1\)。

具体实现细节看代码吧。

\(code:\)

#include<bits/stdc++.h>
#define maxn 4010
using namespace std;
char s1[maxn],s2[maxn];
struct Automata
{
int root,tot,las;
int len[maxn],ch[maxn][30],fa[maxn],last[30];
void clear_sam()
{
tot=las=root=1;
memset(fa,0,sizeof(fa));
memset(ch,0,sizeof(ch));
memset(len,0,sizeof(len));
}
void clear_seq()
{
root=2010;
memset(ch,0,sizeof(ch));
memset(last,0,sizeof(last));
}
void insert(int c)
{
int p=las,np=las=++tot;
len[np]=len[p]+1;
while(p&&!ch[p][c]) ch[p][c]=np,p=fa[p];
if(!p) fa[np]=root;
else
{
int q=ch[p][c];
if(len[q]==len[p]+1) fa[np]=q;
else
{
int nq=++tot;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
len[nq]=len[p]+1,fa[nq]=fa[q],fa[np]=fa[q]=nq;
while(ch[p][c]==q) ch[p][c]=nq,p=fa[p];
}
}
}
void sam(char *s)
{
clear_sam();
int lenth=strlen(s+1);
for(int i=1;i<=lenth;++i) insert(s[i]-'a'+1);
}
void seq(char *s)
{
clear_seq();
int lenth=strlen(s+1);
for(int i=lenth;i;--i)
{
for(int j=1;j<=26;++j) ch[i][j]=last[j];
last[s[i]-'a'+1]=i;
}
for(int i=1;i<=26;++i) ch[root][i]=last[i];
}
}A,B;
struct node
{
int a,b,len;
};
bool vis[maxn][maxn];
int query()
{
memset(vis,0,sizeof(vis));
queue<node> q;
q.push((node){A.root,B.root,0});
vis[A.root][B.root]=true;
while(!q.empty())
{
node now=q.front();
q.pop();
for(int i=1;i<=26;++i)
{
int a=A.ch[now.a][i],b=B.ch[now.b][i];
if(vis[a][b]) continue;
if(a&&!b) return now.len+1;
vis[a][b]=true;
q.push((node){a,b,now.len+1});
}
}
return -1;
}
int main()
{
scanf("%s%s",s1+1,s2+1);
A.sam(s1),B.sam(s2),printf("%d\n",query());
A.sam(s1),B.seq(s2),printf("%d\n",query());
A.seq(s1),B.sam(s2),printf("%d\n",query());
A.seq(s1),B.seq(s2),printf("%d\n",query());
return 0;
}

题解 洛谷 P4112 【[HEOI2015]最短不公共子串】的更多相关文章

  1. 洛谷 P4112 [HEOI2015]最短不公共子串 解题报告

    P4112 [HEOI2015]最短不公共子串 题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的"子串"指的是它的连续的一段,例如bcd是 ...

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

    这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luog ...

  3. 【BZOJ4032】[HEOI2015]最短不公共子串(后缀自动机,序列自动机)

    [BZOJ4032][HEOI2015]最短不公共子串(后缀自动机,序列自动机) 题面 BZOJ 洛谷 题解 数据范围很小,直接暴力构建后缀自动机和序列自动机,然后直接在两个自动机上进行\(bfs\) ...

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

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

  5. bzoj4032: [HEOI2015]最短不公共子串(SAM+DP)

    4032: [HEOI2015]最短不公共子串 题目:传送门 题解: 陈年老题良心%你赛膜爆嘎爷 当初做题...一眼SAM...结果只会两种直接DP的情况... 情况1: 直接设f[i][j] 表示的 ...

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

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

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

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

  8. luoguP4112 [HEOI2015]最短不公共子串 SAM,序列自动机,广搜BFS

    luoguP4112 [HEOI2015]最短不公共子串 链接 luogu loj 思路 子串可以用后缀自动机,子序列可以用序列自动机. 序列自动机是啥,就是能访问到所有子序列的自动机. 每个点记录下 ...

  9. BZOJ4032: [HEOI2015]最短不公共子串(后缀自动机+序列自动机)

    题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...

  10. BZOJ4032[HEOI2015]最短不公共子串——序列自动机+后缀自动机+DP+贪心

    题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...

随机推荐

  1. 基于 Blazor 开发五子棋⚫⚪小游戏

    今天是农历五月初五,端午节.在此,祝大家端午安康! 端午节是中华民族古老的传统节日之一.端午也称端五,端阳.此外,端午节还有许多别称,如:午日节.重五节.五月节.浴兰节.女儿节.天中节.地腊.诗人节. ...

  2. 客官,来看看AspNetCore的身份验证吧

    开篇 这段时间潜水了太久,终于有时间可以更新一篇文章了. 通过本篇文章您将Get: Http的一些身份验证概念 在AspNetCore中实现身份验证方案 JWT等概念的基础知识 使用Bearer To ...

  3. 不就是语法和长难句吗—笔记总结Day3

    ♦5♦状语从句——结果状语从句 · so(+adj / adv)...that · such(+ n)...that ♦6♦状语从句——让步状语从句 · although · though · eve ...

  4. 浅谈auth模块

    目录 auth模块 什么是Auth模块 auth模块的常用方法 用户注册 扩展默认的auth_user表 auth模块 什么是Auth模块 ​ auth模块是对注册登录认证注销修改密码等方法的一种封装 ...

  5. 八.django日志配置

    Django 日志 Django 使用Python 内建的logging 模块打印日志,Python 的logging 配置由四个部分组成: 记录器 —— Logger 处理程序 —— Handler ...

  6. 写出Python中列表、元祖、字典、字符串的至少5种以上的方法

    1.列表 常用方法 作用 参数 append(data) 在尾部添加数据 data-加入到列表中的数据 insert(idx,data) 在指定位置添加数据 idx-索引    data-数据 ext ...

  7. 网页开发中利用CSS以图换字的多中实现方法总汇

    在h1标签中,新增span标签来保存标题内容,然后将其样式设置为display:none <style> h1 { width: 64px; height: 64px; backgroun ...

  8. 洛谷 P4042 [AHOI2014/JSOI2014]骑士游戏

    题意 有\(n\)个怪物,可以消耗\(k\)的代价消灭一个怪物或者消耗\(s\)的代价将它变成另外一个或多个新的怪物,求消灭怪物$的最小代价 思路 \(DP\)+最短路 这几天做的第一道自己能\(yy ...

  9. 线性动归之Wooden Sticks

    题面:现在有n(n<5000)个木头,每个木头都有长度l和重量w(l<10000,w<10000),现在你要对木头进行加工: 1.第一根木头需要先花费1min: 2.加工完第i跟木头 ...

  10. SQL注入笔记-updatexml与extractvalue

    0x1介绍 MySQL 5.1.5版本中添加了对XML文档进行查询和修改的函数 EXTRACTVALUE(XML_document, XPath_string); UPDATEXML(XML_docu ...