bzoj 4032 [HEOI2015]最短不公共子串——后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032
不是 b 的子串的话就对 b 建后缀自动机,在 a 上枚举从每个位置开始的子串或者找子序列(子序列就是记录 a 的前 i 个,走到 b 的 j 状态用的最短长度),对应到自动机上看看能不能走下去就行了。
不是 b 的子序列的话就对 b 建子序列自动机?就是那个知道每个位置再填一个字符会走到哪个位置的数组。然后在 a 上枚举,看看自动机上能不能走下去就行了。
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int N=,M=,K=;
- char a[N],b[N];
- int n,m,cnt=,lst=,go[M][K],fa[M],l[M],nxt[N][K],lt[K];
- int dp[N][M];//M//int
- int Mn(int a,int b){return a<b?a:b;}
- void add(int w)
- {
- int p=lst,np=++cnt;lst=np;l[np]=l[p]+;
- for(;p&&!go[p][w];p=fa[p])go[p][w]=np;
- if(!p)fa[np]=;
- else
- {
- int q=go[p][w];
- if(l[q]==l[p]+)fa[np]=q;
- else
- {
- int nq=++cnt;l[nq]=l[p]+;
- fa[nq]=fa[q];fa[q]=nq;fa[np]=nq;
- memcpy(go[nq],go[q],sizeof go[q]);
- for(;go[p][w]==q;p=fa[p])go[p][w]=nq;
- }
- }
- }
- void solve1()
- {
- int ans=n+;
- for(int i=;i<=n;i++)
- {
- int cr=;
- for(int j=i;j<=n;j++)
- {
- if(!go[cr][a[j]-'a'+])
- {ans=Mn(ans,j-i+);break;}
- cr=go[cr][a[j]-'a'+];
- }
- }
- printf("%d\n",ans>n?-:ans);
- }
- void solve2()
- {
- int ans=n+;
- for(int t=;t<=n;t++)
- {
- int cr=;
- for(int i=t;i<=n;i++)
- {
- int d=a[i]-'a'+;
- if(nxt[cr][d])cr=nxt[cr][d];
- else {ans=Mn(ans,i-t+);break;}
- }
- }
- printf("%d\n",ans>n?-:ans);
- }
- void solve3()
- {
- memset(dp,0x3f,sizeof dp);
- dp[][]=; int ans=n+;
- for(int i=;i<=n;i++)
- {
- int d=a[i]-'a'+;
- for(int j=;j<=cnt;j++)
- if(dp[i-][j]<=n)
- {
- dp[i][j]=Mn(dp[i][j],dp[i-][j]);
- if(!go[j][d])ans=Mn(ans,dp[i-][j]+);
- else dp[i][go[j][d]]=Mn(dp[i][go[j][d]],dp[i-][j]+);
- }
- }
- printf("%d\n",ans>n?-:ans);
- }
- void solve4()
- {
- memset(dp,0x3f,sizeof dp);
- dp[][]=; int ans=n+;
- for(int i=;i<=n;i++)
- {
- int d=a[i]-'a'+;
- for(int j=;j<=m;j++)
- if(dp[i-][j]<=n)
- {
- dp[i][j]=Mn(dp[i][j],dp[i-][j]);
- if(!nxt[j][d])ans=Mn(ans,dp[i-][j]+);
- else dp[i][nxt[j][d]]=Mn(dp[i][nxt[j][d]],dp[i-][j]+);
- }
- }
- printf("%d\n",ans>n?-:ans);
- }
- int main()
- {
- scanf("%s",a+);scanf("%s",b+);
- n=strlen(a+);m=strlen(b+);
- for(int i=;i<=m;i++)add(b[i]-'a'+);
- for(int i=m;i>=;i--)
- {
- for(int j=;j<=;j++)
- nxt[i][j]=lt[j];
- lt[b[i]-'a'+]=i;
- }
- solve1();solve2();
- solve3();solve4();
- return ;
- }
bzoj 4032 [HEOI2015]最短不公共子串——后缀自动机的更多相关文章
- BZOJ 4032: [HEOI2015]最短不公共子串 后缀自动机 暴力
4032: [HEOI2015]最短不公共子串 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4032 Description 在虐各种最 ...
- BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)
传送门 解题思路 首先需要预处理两个串\(nxt(i)(j)\)表示i位置之后最近的\(j\). 第一问直接对\(b\)建后缀自动机,枚举\(a\)的起点暴力匹配. 第二问枚举\(a\)的起点,\(b ...
- bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)
bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ...
- BZOJ 4032: [HEOI2015]最短不公共子串
4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 446 Solved: 224[Submit][Sta ...
- BZOJ.4032.[HEOI2015]最短不公共子串(DP 后缀自动机)
题目链接 1.求A的最短子串,它不是B的子串. 子串是连续的,对B建SAM,枚举起点,在SAM上找到第一个无法匹配点即可.O(n)用SAM能做吗..开始想错了. 2.求A的最短子串,它不是B的子序列. ...
- bzoj 4032: [HEOI2015]最短不公共子串【dp+SAM】
第一.二问: 就是最小的最长公共长度+1,设f[i][j]为a匹配到i,b匹配到j,第一问的转移是f[i][j]=(a[i]==b[j]?f[i-1][j-1]+1:0),第二问的转移是f[i][j] ...
- BZOJ 4032: [HEOI2015]最短不公共子串 (dp*3 + SAM)
转博客大法好 第4个子任务中,为什么只转移最近的一个位置,自己YY吧(多YY有益身体健康). #include <bits/stdc++.h> using namespace std; t ...
- bzoj 4032 [ HEOI 2015 ] 最短不公共子串 —— 后缀自动机+序列自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 序列自动机其实就是每个位置记录一下某字母后面第一个出现位置,为了子序列能尽量长. 对字 ...
- 【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)
[题意]给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短 ...
随机推荐
- Ubuntu系统Anaconda下载安装与切换源教程【转】
本文转载自:https://blog.csdn.net/qq_36268036/article/details/81517893 1. 下载安装: 这里选用国内清华大学的Tuna开源软件镜像站作为演示 ...
- 【P2944】地震损失(最大流,洛谷)
绝对难度虚高的一题 看到题目,至少损坏几个房子,开始考虑最小割,建的是双向边,所以拆点,边权除了自己与自己的之外都连inf.然后把所有求救的点都连到超级源上,跑一遍最大流就可以了. #include& ...
- 监控系统信息模块psutil
About psutil (python system and process utilities) is a cross-platform library for retrieving inform ...
- NumPy矩阵库
NumPy - 矩阵库 NumPy 包包含一个 Matrix库numpy.matlib.此模块的函数返回矩阵而不是返回ndarray对象. matlib.empty() matlib.empty()函 ...
- scala学习手记27 - 下划线与参数
在Scala里,下划线(_)可以表示函数值的参数.如果某个参数在函数里仅使用一次,就可以用下划线表示.每次在函数里用下划线,都表示随后的参数. val arr = Array(1, 2, 3, 4, ...
- 带你彻底明白 Android Studio 打包混淆
前言 在使用Android Studio混淆打包时,该IDE自身集成了Java语言的ProGuard作为压缩,优化和混淆工具,配合Gradle构建工具使用很简单.只需要在工程应用目录的gradle文件 ...
- Http请求原理与相关知识
1.在浏览器地址栏输入URL,按回车后经过了哪些步骤 1-1. 浏览器向DNS服务器请求解析该URL中的域名及所对应的IP地址; 1-2. 解析出IP地址后,根据该IP地址和默认端口80与服务器建立 ...
- spring mvc:常用标签库(文本框,密码框,文本域,复选框,单选按钮,下拉框隐藏于,上传文件等)
在jsp页面需要引入:<%@taglib uri="http://www.springframework.org/tags/form" prefix="form&q ...
- 卸载MicrosoftBAF(删除C:\CommonFramework\instdata.dat)
发现有个可疑文件夹 C:\CommonFramework ,而且还会不停的删除创建 C:\CommonFramework\instdata.dat 最后被发现这是必应的一个框架程序在捣鬼,在微软论坛里 ...
- hdu 5980 Find Small A(水,模拟)
Find Small A Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...