BZOJ4032 : [HEOI2015]最短不公共子串
第一问:
对B串建立SAM,暴力枚举A的每个子串,在SAM上走,若失配则可行。
第二问:
设g[i][j]表示B串的第i个字符之后最早出现的字符j的位置,暴力枚举A的每个子串,按照g贪心地走,若失配则可行。
第三问:
对B串建立SAM,设f[i][j]表示考虑了A的前i个字符,当前在SAM上的状态为j的最小长度,然后DP。
第四问:
设g[i][j]表示B串的第i个字符之后最早出现的字符j的位置,f[i][j]表示考虑了A的前i个字符,当前在g[]中匹配到了j的最小长度,然后DP。
时间复杂度$O(n^2)$。
#include<cstdio>
#include<cstring>
const int N=2010,S=26;
int n,m,i,j,x,ans1=N,ans2=N,ans3=N,ans4=N;char a[N],b[N];
inline void up(int&a,int b){if(a>b)a=b;}
namespace String{
int tot=1,last=1,pre[N<<1],son[N<<1][S],ml[N<<1],f[N][N<<1];
inline void extend(int w){
int p=++tot,x=last,r,q;
for(ml[last=p]=ml[x]+1;x&&!son[x][w];x=pre[x])son[x][w]=p;
if(!x)pre[p]=1;
else if(ml[x]+1==ml[q=son[x][w]])pre[p]=q;
else{
pre[r=++tot]=pre[q];std::memcpy(son[r],son[q],sizeof son[r]);
ml[r]=ml[x]+1;pre[p]=pre[q]=r;
for(;x&&son[x][w]==q;x=pre[x])son[x][w]=r;
}
}
void work(){
for(i=1;i<=m;i++)extend(b[i]);
for(i=1;i<=n;i++)for(x=1,j=i;j<=n&&j-i+1<ans1;j++){
x=son[x][a[j]];
if(!x)ans1=j-i+1;
}
for(i=0;i<=n;i++)for(j=1;j<=tot;j++)f[i][j]=N;
for(f[0][1]=i=0;i<n;i++)for(j=1;j<=tot;j++)if(f[i][j]<N){
up(f[i+1][j],f[i][j]);
if(son[j][a[i+1]])up(f[i+1][son[j][a[i+1]]],f[i][j]+1);else up(ans3,f[i][j]+1);
}
}
}
namespace Sequence{
int g[N][S],f[N][N];
void work(){
for(j=0;j<S;j++)g[m][j]=-1;
for(i=m;i;i--)for(j=0;j<S;j++)if(b[i]==j)g[i-1][j]=i;else g[i-1][j]=g[i][j];
for(i=1;i<=n;i++)for(x=0,j=i;j<=n&&j-i+1<ans2;j++){
x=g[x][a[j]];
if(x<0)ans2=j-i+1;
}
for(i=0;i<=n;i++)for(j=0;j<=m;j++)f[i][j]=N;
for(f[0][0]=i=0;i<n;i++)for(j=0;j<=m;j++)if(f[i][j]<N){
up(f[i+1][j],f[i][j]);
if(~g[j][a[i+1]])up(f[i+1][g[j][a[i+1]]],f[i][j]+1);else up(ans4,f[i][j]+1);
}
}
}
int main(){
scanf("%s%s",a+1,b+1),n=strlen(a+1),m=strlen(b+1);
for(i=1;i<=n;i++)a[i]-='a';
for(i=1;i<=m;i++)b[i]-='a';
String::work();
Sequence::work();
if(ans1==N)ans1=-1;
if(ans2==N)ans2=-1;
if(ans3==N)ans3=-1;
if(ans4==N)ans4=-1;
return printf("%d\n%d\n%d\n%d",ans1,ans2,ans3,ans4),0;
}
BZOJ4032 : [HEOI2015]最短不公共子串的更多相关文章
- bzoj4032: [HEOI2015]最短不公共子串(SAM+DP)
4032: [HEOI2015]最短不公共子串 题目:传送门 题解: 陈年老题良心%你赛膜爆嘎爷 当初做题...一眼SAM...结果只会两种直接DP的情况... 情况1: 直接设f[i][j] 表示的 ...
- BZOJ4032[HEOI2015]最短不公共子串——序列自动机+后缀自动机+DP+贪心
题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...
- BZOJ4032:[HEOI2015]最短不公共子串(SAM)
Description 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列” ...
- [BZOJ4032][HEOI2015]最短不公共子串(Trie+DP)
在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之——被它们虐. 操作一:对A,B分别建SAM,暴力BFS. 操作二:对B建序列自动机或SAM,A在上面暴力匹配. 操作三:对A,B建 ...
- BZOJ4032: [HEOI2015]最短不公共子串(后缀自动机+序列自动机)
题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...
- BZOJ4032 [HEOI2015]最短不公共子串 【后缀自动机 + 序列自动机 + dp】
题目链接 BZOJ4032 题解 首先膜\(hb\) 空手切神题 一问\(hash\),二问枚举 三问\(trie\)树,四问\(dp\) 南二巨佬神\(hb\) 空手吊打自动机 \(orz orz ...
- 【BZOJ4032】[HEOI2015]最短不公共子串(后缀自动机,序列自动机)
[BZOJ4032][HEOI2015]最短不公共子串(后缀自动机,序列自动机) 题面 BZOJ 洛谷 题解 数据范围很小,直接暴力构建后缀自动机和序列自动机,然后直接在两个自动机上进行\(bfs\) ...
- 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 ...
随机推荐
- Ubuntu 下 LAMP 的配置文件路径 转:
配置文件路径: 1>apache 的配置文件路径 /etc/apache2/apache2.conf 2>apache 网站字符编码配置路径 /etc/apache2/conf.d/c ...
- zb的生日
http://acm.nyist.net/JudgeOnline/problem.php?pid=325 zb的生日 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 ...
- [ruby on rails] 跟我学之(2)HelloWorld
1. 创建工程 rails new blog 2.查看下文件结构 tree 输出如下,请留意红圈中的部分. Gemfile, 用来管理应用程序的gems, 有点类似于python的包,有专门的网站来查 ...
- apache ab压力测试报错(apr_socket_recv: Connection reset by peer (104))
apache ab压力测试报错(apr_socket_recv: Connection reset by peer (104)) 今天用apache 自带的ab工具测试,当并发量达到1000多的时 ...
- nginx lua处理图片
user apache apache; worker_processes 4; worker_rlimit_nofile 100000; #error_log logs/error.log; #err ...
- linux增加自定义path和manpath
linux安装软件到自定义路径时,新安装的命令需要带上路径才可以执行,不能像系统自带命令那样可以直接使用. 这个时候可以通过修改环境变量PATH和MANPATH,来实现像系统命令一样使用新安装的命令并 ...
- jQuery backgroundColor的animate效果
我们知道jQuery几乎是我们最常用的javascript库了,不过尽管他自己本身拥有大量的特效,但却仍然缺少一些动画效果.比如说,颜色.背景颜色的变换. animate一般只支持大小,位置,透明度的 ...
- CheckBoxList1复选框
循环绑定数据的两个方法: List<string> LIColl = new List<string>(); protected void Page_Load(object s ...
- codeigniter load_class
2014年7月7日 14:33:36 函数定义在 system/core/common.php中 使用方法是 load_class('Hooks', 'core'): 在core目录内寻找Hooks类 ...
- XP下使用IIS访问asp出现无权查看网页问题的解决办法
这是用户权限问题,因为你用的磁盘是NTFS格式. 解决方法: 一.添加用户(“Everyone”或者“IUSR_你的机器名”,如IUSR_HONG,即“Internet 来宾用户”) 二.修改用户权限 ...