BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)
传送门
解题思路
首先需要预处理两个串\(nxt(i)(j)\)表示i位置之后最近的\(j\)。
第一问直接对\(b\)建后缀自动机,枚举\(a\)的起点暴力匹配。
第二问枚举\(a\)的起点,\(b\)用\(nxt\)跳。
第三问\(a\)与\(b\)一起跳,\(b\)用后缀自动机,\(a\)用\(nxt\)。
第四问\(a\)与\(b\)一起跳,都用\(nxt\),要加记忆化。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>using namespace std;
const int N=2005;inline int min(int x,int y) {return x<y?x:y;}int lena,lenb,ans=1e9,nxta[N][27],prea[27],nxtb[N][27],preb[27];
int vis[N][N];
char A[N],B[N];struct SAM{int lst,cnt,fa[N<<1],ch[N<<1][27],l[N<<1];inline void insert(int c){int p=lst,np=++cnt; lst=cnt; l[np]=l[p]+1;for(;p && !ch[p][c];p=fa[p]) ch[p][c]=np;if(!p) fa[np]=1;else {int q=ch[p][c];if(l[q]==l[p]+1) fa[np]=q;else {int nq=++cnt; l[nq]=l[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[q]));fa[nq]=fa[q]; fa[q]=fa[np]=nq;for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;}}}inline int query1(int x){int p=1,ret=0;for(int i=x;i<=lena;i++) {if(ch[p][A[i]-'a']) p=ch[p][A[i]-'a'],ret++;else return ret+1; }return 1e9;}inline void query3(int x,int y,int l){for(int i=0;i<26;i++){if(!ch[y][i] && nxta[x][i]) ans=min(ans,l);else if(ch[y][i] && nxta[x][i]) query3(nxta[x][i],ch[y][i],l+1);}}
}sam;inline int query2(int x){int now=0,ret=0;for(int i=x;i<=lena;i++){if(!nxtb[now][A[i]-'a']) return ret+1;ret++; now=nxtb[now][A[i]-'a'];}return 1e9;
}int query4(int x,int y){if(x && !y) return 1;if(vis[x][y]) return vis[x][y];int tmp=1e9;for(int i=0;i<26;i++){if(!nxta[x][i]) continue;tmp=min(tmp,query4(nxta[x][i],nxtb[y][i]));}vis[x][y]=tmp+1;return vis[x][y];
}int main(){scanf("%s%s",A+1,B+1); sam.cnt=sam.lst=1;lena=strlen(A+1); lenb=strlen(B+1);for(int i=lena;~i;i--) {for(int j=0;j<26;j++) nxta[i][j]=prea[j];prea[A[i]-'a']=i; }for(int i=lenb;~i;i--){for(int j=0;j<26;j++) nxtb[i][j]=preb[j];preb[B[i]-'a']=i;} for(int i=1;i<=lenb;i++) sam.insert(B[i]-'a');for(int i=1;i<=lena;i++) ans=min(ans,sam.query1(i));printf("%d\n",(ans==1e9)?-1:ans); ans=1e9;for(int i=1;i<=lena;i++) ans=min(ans,query2(i));printf("%d\n",(ans==1e9)?-1:ans); ans=1e9; sam.query3(0,1,0);printf("%d\n",(ans==1e9)?-1:ans+1); ans=query4(0,0)-1;printf("%d\n",(ans==1e9)?-1:ans);return 0;
}
转载于:https://www.cnblogs.com/sdfzsyq/p/10290924.html
BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)相关推荐
- 【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)
[题意]给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短 ...
- 最长公共子串_两个字符串的最长公共子串(后缀自动机)
// 最长公共子序列(后缀自动机) typedef struct state {int len, link;map<char, int> next; }state;const int MA ...
- BZOJ 4032 luogu P4112 [HEOI2015]最短不公共子串 (DP、后缀自动机)
这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luog ...
- 【正睿2021寒假省选第二轮集训 day 1】串 (后缀自动机+记忆化)
description 定义一个字符串的子串是这个字符串的某个连续区间的字符组成的串.比如,"djq"的子串是"d","j","q ...
- BZOJ 1589 Trick or Treat on the Farm (tarjan缩点,记忆化搜索)[Usaco 2008 Dec Gold]【BZOJ计划】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://hydro.ac/d/bzoj/p/1589 Problem 每年万圣 ...
- [BZOJ 1048] [HAOI2007] 分割矩阵 【记忆化搜索】
题目链接:BZOJ - 1048 题目分析 感觉这种分割矩阵之类的题目很多都是这样子的. 方差中用到的平均数是可以直接算出来的,然后记忆化搜索 Solve(x, xx, y, yy, k) 表示横坐标 ...
- bzoj 2946 [Poi2000]公共串——后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...
- BZOJ 2806 Luogu P4022 [CTSC2012]Cheat (广义后缀自动机、DP、二分、单调队列)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2806 (luogu) https://www.luogu.org/pro ...
- BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)
题目链接 \(Description\) 给定n个模式串,多次询问一个串在多少个模式串中出现过.(字符集为26个小写字母) \(Solution\) 对每个询问串进行匹配最终会达到一个节点,我们需要得 ...
最新文章
- linux知识记录20192022
- 有序数组求中位数问题
- 如何设计数据库表实现完整的RBAC(基于角色权限控制)
- Mysql数据库正则表达式
- 趣味图解+源码分析,轻松吃透Linux
- Orleans解决并发之痛(四):Streams
- LeetCode 12. Integer to Roman
- 重新认识fprint,sprint
- R语言metafor包预后meta分析复现
- JavaScript导出excel文件,并修改文件样式
- Ice helloworld
- 一剪梅·红藕香残玉簟秋
- 【Golang开发面经】字节跳动(三轮技术面)
- Silverlight游戏设计(Game Design):(十三)帝国时代II (Demo) 之 “战争艺术”②
- iOS 磁场传感器的应用 Swift CoreMotion使用
- 钉钉在线课程开启屏幕共享时电脑蓝屏问题解决办法
- MIXLY二次开发(傻瓜版)
- Web前端大作业—里约热内卢奥运会(html+css+javascript)
- element-ui upload上传技巧
- mysql数据库1067错误解决方法