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. 前端编程的核心问题是数据与UI的绑定

    1.静态页面---静态绑定 2.js dom强修改--js重置绑定: 3.chymeleaf--预处理html+特殊语言绑定: 4.react--组建化UI.js与其他语言形式绑定

  2. 一款比较强大的jquery表格插件Datatables

    Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 链接:http://www.datatables.club/ 本人无聊时发现的一款用 ...

  3. 将fileupload标签的值清空

    在开发中遇到了这样一个问题,在一个form表单中,有一个fileupload标签,新增,修改都是同一个form,当我第一次选择了上传文件路径,并且提交之后,第二次再使用这个form,这次没有选择上传文 ...

  4. Grafana官方和社区提供的dashboard

    详见:https://grafana.com/grafana/dashboards 可以在左侧配置筛选条件,非常强大. 当然Grafana中所有的Dashboard通过JSON进行共享,下载并且导入这 ...

  5. Computer Networking: A Top Down Approach

    目录 Chapter 1: Computer Networks and the Internet 1. What is the Internet? 2. The Network Edge 3. The ...

  6. Apache加固之目录、文件限制

    如果你用类似phpstudy集成平台的话,所有你想要修改的配置基本上在phpstudy上就可以直接设置操作.但如果你的服务器是通过一步步安装的(Apache+PHP+Mysql)的话,那么就要对各功能 ...

  7. 解决bootstrap模态框居中问题

    完美解决办法: 在bootstrap.js或bootstrap.min.js文件中找到Modal.prototype.show方法. 在that.$element.addClass('in').att ...

  8. Linux装B命令

    原文:https://mp.weixin.qq.com/s/CNmMRjl0iZ8EBPq5VgJHsA 1.空心字体 yum install -y figlet figlet happy 1.0 2 ...

  9. 【转载】自定义View,有这一篇就够了

    为了扫除学习中的忙点,尽可能多的覆盖Android知识的边边角角,决定对自定义View做一个稍微全面一点的使用方法总结,在内容上面并没有什么独特的地方,其他大神们博客上面基本上都有讲这方面的内容,如果 ...

  10. c#时间与时间戳互转13位

    Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00 ...