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

题面

BZOJ

洛谷

题解

数据范围很小,直接暴力构建后缀自动机和序列自动机,然后直接在两个自动机上进行\(bfs\),找到的第一个不同时存在的节点就直接输出就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define MAX 4040
struct SAM
{
struct Node{int son[26],ff,len;}t[MAX];
int tot,last;void init(){tot=last=1;}
void extend(int c)
{
int p=last,np=++tot;last=tot;
t[np].len=t[p].len+1;
while(p&&!t[p].son[c])t[p].son[c]=np,p=t[p].ff;
if(!p)t[np].ff=1;
else
{
int q=t[p].son[c];
if(t[q].len==t[p].len+1)t[np].ff=q;
else
{
int nq=++tot;
t[nq]=t[q];t[nq].len=t[p].len+1;
t[q].ff=t[np].ff=nq;
while(p&&t[p].son[c]==q)t[p].son[c]=nq,p=t[p].ff;
}
}
}
}A,B;
struct SQAM
{
struct Node{int son[26];}t[MAX];
int lst[26],pre[MAX],tot,last;
void init(){tot=last=1;for(int i=0;i<26;++i)lst[i]=1;}
void extend(int c)
{
int p=lst[c],np=++tot;
pre[np]=p;
for(int i=0;i<26;++i)
for(int j=lst[i];j&&!t[j].son[c];j=pre[j])
t[j].son[c]=np;
lst[c]=np;
}
}AA,BB;
char SA[MAX],SB[MAX];
int na,nb;
struct Node{int len,a,b;};
bool vis[MAX][MAX];
int bfs1(SAM &A,SAM &B)
{
queue<Node> Q;Q.push((Node){0,1,1});
memset(vis,0,sizeof(vis));vis[1][1]=true;
while(!Q.empty())
{
Node p=Q.front();Q.pop();
for(int i=0;i<26;++i)
{
int x=A.t[p.a].son[i];
int y=B.t[p.b].son[i];
if(x&&y)
{
if(vis[x][y])continue;
vis[x][y]=true;Q.push((Node){p.len+1,x,y});
}
if(x&&!y)return p.len+1;
}
}
return -1;
}
int bfs2(SAM &A,SQAM &B)
{
queue<Node> Q;Q.push((Node){0,1,1});
memset(vis,0,sizeof(vis));vis[1][1]=true;
while(!Q.empty())
{
Node p=Q.front();Q.pop();
for(int i=0;i<26;++i)
{
int x=A.t[p.a].son[i];
int y=B.t[p.b].son[i];
if(x&&y)
{
if(vis[x][y])continue;
vis[x][y]=true;Q.push((Node){p.len+1,x,y});
}
if(x&&!y)return p.len+1;
}
}
return -1;
}
int bfs3(SQAM &A,SAM &B)
{
queue<Node> Q;Q.push((Node){0,1,1});
memset(vis,0,sizeof(vis));vis[1][1]=true;
while(!Q.empty())
{
Node p=Q.front();Q.pop();
for(int i=0;i<26;++i)
{
int x=A.t[p.a].son[i];
int y=B.t[p.b].son[i];
if(x&&y)
{
if(vis[x][y])continue;
vis[x][y]=true;Q.push((Node){p.len+1,x,y});
}
if(x&&!y)return p.len+1;
}
}
return -1;
}
int bfs4(SQAM &A,SQAM &B)
{
queue<Node> Q;Q.push((Node){0,1,1});
memset(vis,0,sizeof(vis));vis[1][1]=true;
while(!Q.empty())
{
Node p=Q.front();Q.pop();
for(int i=0;i<26;++i)
{
int x=A.t[p.a].son[i];
int y=B.t[p.b].son[i];
if(x&&y)
{
if(vis[x][y])continue;
vis[x][y]=true;Q.push((Node){p.len+1,x,y});
}
if(x&&!y)return p.len+1;
}
}
return -1;
}
int main()
{
scanf("%s%s",SA+1,SB+1);
na=strlen(SA+1);nb=strlen(SB+1);
A.init();B.init();AA.init();BB.init();
for(int i=1;i<=na;++i)A.extend(SA[i]-97);
for(int i=1;i<=nb;++i)B.extend(SB[i]-97);
for(int i=1;i<=na;++i)AA.extend(SA[i]-97);
for(int i=1;i<=nb;++i)BB.extend(SB[i]-97);
printf("%d\n%d\n%d\n%d\n",bfs1(A,B),bfs2(A,BB),bfs3(AA,B),bfs4(AA,BB));
return 0;
}

【BZOJ4032】[HEOI2015]最短不公共子串(后缀自动机,序列自动机)的更多相关文章

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

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

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

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

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

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

  4. BZOJ4032 [HEOI2015]最短不公共子串 【后缀自动机 + 序列自动机 + dp】

    题目链接 BZOJ4032 题解 首先膜\(hb\) 空手切神题 一问\(hash\),二问枚举 三问\(trie\)树,四问\(dp\) 南二巨佬神\(hb\) 空手吊打自动机 \(orz orz ...

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

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

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

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

  7. [BZOJ4032][HEOI2015]最短不公共子串(Trie+DP)

    在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之——被它们虐. 操作一:对A,B分别建SAM,暴力BFS. 操作二:对B建序列自动机或SAM,A在上面暴力匹配. 操作三:对A,B建 ...

  8. BZOJ4032:[HEOI2015]最短不公共子串(SAM)

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

  9. bzoj 4032 [HEOI2015]最短不公共子串——后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 不是 b 的子串的话就对 b 建后缀自动机,在 a 上枚举从每个位置开始的子串或者找子 ...

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

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

随机推荐

  1. spring的理解

    看过<fate系列>的博友知道,这是一个七位英灵的圣杯争夺战争.今天主要来谈谈圣杯的容器概念,以便对spring的理解. 圣杯: 圣杯本身是没有实体的,而是将具有魔术回路的存在(人)作为“ ...

  2. 使用wepy开发微信小程序01——常用的组件

    1.axio.js 'use strict' import axios from 'axios' import wepyAxiosAdapter from 'wepy-plugin-axios/dis ...

  3. PhP数据库 Mysql dos命令

    mysql 这是一个关系型数据库,存在表的概念. 结构 数据库可以存放多张表,每个表可以存放多个字段,每个字段可以存放多个记录. dos命令操作数据库 phpstudy使用终端打开数据库 第一步: 第 ...

  4. 浏览器的同源策略及CORS跨域解决方案 DRF

    一个源的定义 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 举个例子: 下表给出了相对http://a.xyz.com/dir/page.html同源检测的示例: UR ...

  5. js中console使用2

    接着上一篇js中console使用1,本片继续介绍js中console的用法 测试代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 ...

  6. Redmine入门-安装

    Redmine提供了两种方式安装,如果仅仅只是使用Redmine,建议采用一键安装的方式,快捷方便.如果需要做二次开发或者更多的个性化处理,可以采用源码安装方式,下面分别介绍两种安装方式. ----- ...

  7. 各种raid对比

    级别 最少单元 特征 冗余 性能 空间利用率 综合评价 RAID0 1 分片分散存入 否 读写2倍 100% 分散存储,任何一块坏掉数据则不完整 RAID1 2 相同数据存入2个磁盘 是 写不变,读快 ...

  8. 看到了必须要Mark啊,最全的编程中英文词汇对照汇总(里面有好几个版本的,每个版本从a到d的顺序排列)

    java:  第一章: JDK(Java Development Kit) java开发工具包 JVM(Java Virtual Machine) java虚拟机 Javac  编译命令 java   ...

  9. HTML基础-------最初概念以及相关语法

    HTML概念以及相关语法 HTML HTML是一种类似于(c,java,c++)之类的语言,他是用来描述网页的一种语言.通过各种标签所代表的语义来构建出一个网页,再通过浏览器的渲染功能来实现该网页的各 ...

  10. flask-cache报错No module named 'flask.ext;解决方案

    找到flask-cache包中的jinja2ext.py,将from flask.ext.cache import make_template_fragment_key改为from flask_cac ...