luoguP4112 [HEOI2015]最短不公共子串

链接

luogu

loj

思路

子串可以用后缀自动机,子序列可以用序列自动机。

序列自动机是啥,就是能访问到所有子序列的自动机。

每个点记录下一个字母最近出现的位置。不过我这里构造是\(O(n^2)\)。

然后进行bfs进行广搜就行了。

注意vis[][]剪枝,要不TLE。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2000+7;
int n,m;
struct node {
int len,fa,ch[26];
}dian[4][N<<1];
int las[4]={1,1,1,1},tot[4]={1,1,1,1};
void add(int c,int who) {
int p=las[who];int np=las[who]=++tot[who];
dian[who][np].len=dian[who][p].len+1;
for(;p&&!dian[who][p].ch[c];p=dian[who][p].fa) dian[who][p].ch[c]=np;
if(!p) dian[who][np].fa=1;
else {
int q=dian[who][p].ch[c];
if(dian[who][q].len==dian[who][p].len+1) dian[who][np].fa=q;
else {
int nq=++tot[who];
dian[who][nq]=dian[who][q];
dian[who][nq].len=dian[who][p].len+1;
dian[who][q].fa=dian[who][np].fa=nq;
for(;p&&dian[who][p].ch[c]==q;p=dian[who][p].fa)
dian[who][p].ch[c]=nq;
}
}
}
struct edge{char s[N];}a,b;
int vis[N<<1][N<<1],flag;
void bfs(int T_T,int QwQ) {
queue<pair<pair<int,int>,int> > q;
q.push(make_pair(make_pair(1,1),1));
while(!q.empty()) {
pair<pair<int,int>,int> u=q.front();
node lj1=dian[T_T][u.first.first],lj2=dian[QwQ][u.first.second];
q.pop();
for(int i=0;i<26;++i) {
if(lj1.ch[i]&&!lj2.ch[i])
return printf("%d\n",u.second),void();
if(lj1.ch[i]&&lj2.ch[i]&&vis[lj1.ch[i]][lj2.ch[i]]!=flag) {
q.push(make_pair(make_pair(lj1.ch[i],lj2.ch[i]),u.second+1));
vis[lj1.ch[i]][lj2.ch[i]]=flag;
}
}
}
puts("-1");
}
int main() {
scanf("%s%s",a.s,b.s);
n=strlen(a.s),m=strlen(b.s);
for(int i=0;i<n;++i) add(a.s[i]-'a',0);
for(int i=0;i<m;++i) add(b.s[i]-'a',1);
//build a
for(int i=0;i<n;++i)
if(!dian[2][1].ch[a.s[i]-'a'])
dian[2][1].ch[a.s[i]-'a']=i+2;
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
if(!dian[2][i+2].ch[a.s[j]-'a'])
dian[2][i+2].ch[a.s[j]-'a']=j+2;
//build b
for(int i=0;i<m;++i)
if(!dian[3][1].ch[b.s[i]-'a'])
dian[3][1].ch[b.s[i]-'a']=i+2;
for(int i=0;i<m;++i)
for(int j=i+1;j<m;++j)
if(!dian[3][i+2].ch[b.s[j]-'a'])
dian[3][i+2].ch[b.s[j]-'a']=j+2;
flag++,bfs(0,1);
flag++,bfs(0,3);
flag++,bfs(2,1);
flag++,bfs(2,3);
return 0;
}

luoguP4112 [HEOI2015]最短不公共子串 SAM,序列自动机,广搜BFS的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

    题目链接 1.求A的最短子串,它不是B的子串. 子串是连续的,对B建SAM,枚举起点,在SAM上找到第一个无法匹配点即可.O(n)用SAM能做吗..开始想错了. 2.求A的最短子串,它不是B的子序列. ...

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

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

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

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

随机推荐

  1. Java面试宝典(2020版)

    一.Java 基础 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java ...

  2. Marshmallow详解

    目录 Marshmallow详解 1. Scheme 2. Serializing(序列化) 3. 过滤输出 4. Deserializing(反序列化) 5. 处理多个对象的集合 6. Valida ...

  3. Sqoop import导入表时报错java.lang.ClassNotFoundException: org.json.JSONObject

    报错原因:sqoop缺少java-json.jar包. 解决方案:一. 下载java-json.jar包地址:https://download.csdn.net/download/qq_2213643 ...

  4. winform+cefSharp实现窗体加载浏览器

    1:新建winform项目 2:安装cefSharp 3:配置管理器更改为X86 4:添加引用 using CefSharp; using CefSharp.WinForms; 5:项目启动,打开网页 ...

  5. Crontab常用命令总结

    一.启动服务 /sbin/service crond start 二.关闭服务 /sbin/service crond stop 三.重启服务 /sbin/service crond restart ...

  6. Java 字符串(二)字符串常用操作

    一.连接字符串 1.连接多个字符串 使用“+”运算符可以实现连接多个字符串的功能.“+” 运算符可以连接多个运算符并产生一个 String 对象. 2.连接其他数据类型 字符串与其他基本数据类型进行连 ...

  7. ThinkPHP5中如何实现模板完全静态化

    模板完全静态化,也就是通过模板完全生成纯静态的网页,相比动态页面和伪静态页面更安全更利于SEO访问更快.相比前二者各有利弊吧,现在稍微对这三种形式的优缺点对比一下,以及在ThinkPHP5项目中实现完 ...

  8. MySQL安装和使用

    1.MySQL安装: 1).到MySQL官网https://dev.mysql.com/downloads/installer/,下载MySQL 5.7版本:(注:现在官网上最新版本已经变成8.0.1 ...

  9. Linux基础:时间同步工具Chrony

    在Linux下,默认情况下,系统时间和硬件时间,并不会自动同步.在Linux运行过程中,系统时间和硬件时间以异步的方式运行,互不干扰.硬件时间的运行,是靠Bios电池来维持,而系统时间,是用CPU t ...

  10. Pandas 之 描述性统计案例

    认识 jupyter地址: https://nbviewer.jupyter.org/github/chenjieyouge/jupyter_share/blob/master/share/panda ...