【BZOJ4032】[HEOI2015]最短不公共子串(后缀自动机,序列自动机)
【BZOJ4032】[HEOI2015]最短不公共子串(后缀自动机,序列自动机)
题面
题解
数据范围很小,直接暴力构建后缀自动机和序列自动机,然后直接在两个自动机上进行\(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]最短不公共子串(后缀自动机,序列自动机)的更多相关文章
- bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)
bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ...
- BZOJ 4032: [HEOI2015]最短不公共子串 后缀自动机 暴力
4032: [HEOI2015]最短不公共子串 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4032 Description 在虐各种最 ...
- bzoj4032: [HEOI2015]最短不公共子串(SAM+DP)
4032: [HEOI2015]最短不公共子串 题目:传送门 题解: 陈年老题良心%你赛膜爆嘎爷 当初做题...一眼SAM...结果只会两种直接DP的情况... 情况1: 直接设f[i][j] 表示的 ...
- BZOJ4032 [HEOI2015]最短不公共子串 【后缀自动机 + 序列自动机 + dp】
题目链接 BZOJ4032 题解 首先膜\(hb\) 空手切神题 一问\(hash\),二问枚举 三问\(trie\)树,四问\(dp\) 南二巨佬神\(hb\) 空手吊打自动机 \(orz orz ...
- BZOJ4032[HEOI2015]最短不公共子串——序列自动机+后缀自动机+DP+贪心
题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...
- BZOJ4032: [HEOI2015]最短不公共子串(后缀自动机+序列自动机)
题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...
- [BZOJ4032][HEOI2015]最短不公共子串(Trie+DP)
在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之——被它们虐. 操作一:对A,B分别建SAM,暴力BFS. 操作二:对B建序列自动机或SAM,A在上面暴力匹配. 操作三:对A,B建 ...
- BZOJ4032:[HEOI2015]最短不公共子串(SAM)
Description 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列” ...
- bzoj 4032 [HEOI2015]最短不公共子串——后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 不是 b 的子串的话就对 b 建后缀自动机,在 a 上枚举从每个位置开始的子串或者找子 ...
- BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)
传送门 解题思路 首先需要预处理两个串\(nxt(i)(j)\)表示i位置之后最近的\(j\). 第一问直接对\(b\)建后缀自动机,枚举\(a\)的起点暴力匹配. 第二问枚举\(a\)的起点,\(b ...
随机推荐
- Vue + WebApi 小项目:构造自己的在线 Markdown 笔记本应用
Vue + WebApi 小项目:构造自己的在线 Markdown 笔记本应用 目录 概要 知识点 完整示例图 代码与资源文件 流程步骤 概要 基于 MVP 最小可行性产品设计理念,我们先完成一个可以 ...
- Spring MVC(二)基于标注的MVC
1.基于标注的Spring MVC 1.1 建立一个项目导入jar包(ioc aop mvc) 拷贝容器对应的配置文件到src下 在WEB-INF建立一个login.jsp 1.2 在web.xml ...
- Java thrift服务器和客户端创建实例
首先环境介绍一下: 1.IntelliJ IDEA 2017.1 2.thrift-0.9.3 相信大家在看我这篇文章的时候已经对thrift通信框架已有所调研,这里就不再赘述了,直接进入正题: &l ...
- 亿级流量场景下,大型架构设计实现【2】---storm篇
承接之前的博:亿级流量场景下,大型缓存架构设计实现 续写本博客: ****************** start: 接下来,我们是要讲解商品详情页缓存架构,缓存预热和解决方案,缓存预热可能导致整个系 ...
- JS 字符串对象 数组对象 函数对象 函数作用域
一.内置对象 object对象:ECMAScript 中的所有对象都由这个对象继承而来:Object 对象中的所有属性和方法都会出现在其他对象中 ToString() : 返回对象的原始字符串表示.V ...
- HttpClient 报错 Invalid cookie header, Invalid 'expires' attribute: Thu, 01 Jan 1970 00:00:00 GMT
今天在给我姐夫写一个 QQ 自动加好友的程序,但是在 HttpClient 登陆 QQ 的时候报了一个错: -- ::] - Invalid cookie header: Jan :: GMT -- ...
- base64图片存储
将图片转换为Base64编码,可以让你很方便地在没有上传文件的条件下将图片插入其它的网页.编辑器中. 这对于一些小的图片是极为方便的,因为你不需要再去寻找一个保存图片的地方. Base64编码在ora ...
- java8及8之前日期相关类
java 8日期相关类 Instant:精确到纳秒的时间戳 Duration:处理有关基于时间的时间量 LocalDate:只包含日期,比如:2016-10-20 LocalTime:只包含时间,比如 ...
- python3.6+selenium3.13 自动化测试项目实战一
自己亲自写的第一个小项目,学了几天写出来的一个小模块,可能还不是很完美,但是还算可以了,初学者看看还是很有用的,代码注释不是很多,有问题可以加我QQ 281754043 一.项目介绍 目的: 测试某官 ...
- Linux Mint如何添加windows分享的网络打印机?
1.安装samba sudo apt-get install samba 2.找到系统打印机选项 通过 Menu-->>控制中心-->>系统管理找到 Printers选项,双击 ...