第一、二问:

就是最小的最长公共长度+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]=(a[i]b[j]?f[i-1][j-1]+1:f[i][j-1]),注意这里更新最小公共长度的时候,如果f[i][j]==i就不能更新,因为不能从前面随便新加的字符,后面加的不能保证不相等

第三问:

对b串建SAM,设g[i]为匹配到SAM上点i时的最短长度,然后枚举a的字符,如果能转移就转移,否则用失配位置更新答案

第四问:

同上,不用SAM,设c[i][j]为b串位置i后面第一个字符j的位置,当成SAM的ch转移,然后dp同上

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=4005;
int n,m,f[N][N],ans,ch[N][26],fa[N],tot=1,cur=1,la,dis[N],g[N],l[26],c[N][26];
char a[N],b[N];
void ins(int c,int id)
{
la=cur;
dis[cur=++tot]=id;
int p=la;
for(;p&&!ch[p][c];p=fa[p])
ch[p][c]=cur;
if(!p)
fa[cur]=1;
else
{
int q=ch[p][c];
if(dis[q]==dis[p]+1)
fa[cur]=q;
else
{
int nq=++tot;
dis[nq]=dis[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[nq]=fa[q];
fa[q]=fa[cur]=nq;
for(;ch[p][c]==q;p=fa[p])
ch[p][c]=nq;
}
}
}
int main()
{
scanf("%s%s",a+1,b+1);
n=strlen(a+1),m=strlen(b+1);
ans=1e9;
for(int i=1;i<=n;i++)
{
int mx=0;
for(int j=1;j<=m;j++)
{
if(a[i]==b[j])
f[i][j]=f[i-1][j-1]+1;
mx=max(mx,f[i][j]);
}
if(mx!=i)
ans=min(ans,mx+1);
}
printf("%d\n",ans>n?-1:ans);
ans=1e9;
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
{
int mx=0;
for(int j=1;j<=m;j++)
{
if(a[i]==b[j])
f[i][j]=f[i-1][j-1]+1;
else
f[i][j]=f[i][j-1];
mx=max(mx,f[i][j]);
}
if(mx!=i)
ans=min(ans,mx+1);
}
printf("%d\n",ans>n?-1:ans);
for(int i=1;i<=m;i++)
ins(b[i]-'a',i);
ans=1e9;
memset(g,0x3f,sizeof(g));
g[1]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=tot;j++)
{
if(!ch[j][a[i]-'a'])
ans=min(ans,g[j]+1);
else
g[ch[j][a[i]-'a']]=min(g[ch[j][a[i]-'a']],g[j]+1);
}
printf("%d\n",ans>n?-1:ans);
for(int i=m;i>=0;i--)
{
for(int j=0;j<26;j++)
c[i][j]=l[j];
l[b[i]-'a']=i;
}
ans=1e9;
memset(g,0x3f,sizeof(g));
g[0]=0;
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--)
{
if(!c[j][a[i]-'a'])
ans=min(ans,g[j]+1);
else
g[c[j][a[i]-'a']]=min(g[c[j][a[i]-'a']],g[j]+1);
}
printf("%d\n",ans>n?-1:ans);
return 0;
}

bzoj 4032: [HEOI2015]最短不公共子串【dp+SAM】的更多相关文章

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

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

  2. BZOJ 4032: [HEOI2015]最短不公共子串 (dp*3 + SAM)

    转博客大法好 第4个子任务中,为什么只转移最近的一个位置,自己YY吧(多YY有益身体健康). #include <bits/stdc++.h> using namespace std; t ...

  3. BZOJ 4032: [HEOI2015]最短不公共子串 后缀自动机 暴力

    4032: [HEOI2015]最短不公共子串 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4032 Description 在虐各种最 ...

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

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

  5. bzoj 4032 [HEOI2015]最短不公共子串——后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 不是 b 的子串的话就对 b 建后缀自动机,在 a 上枚举从每个位置开始的子串或者找子 ...

  6. BZOJ 4032: [HEOI2015]最短不公共子串(后缀自动机+记忆化搜索)

    传送门 解题思路 首先需要预处理两个串\(nxt(i)(j)\)表示i位置之后最近的\(j\). 第一问直接对\(b\)建后缀自动机,枚举\(a\)的起点暴力匹配. 第二问枚举\(a\)的起点,\(b ...

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

    这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luog ...

  8. 【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)

    [题意]给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短 ...

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

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

随机推荐

  1. warez世界顶级压缩作品网站

    http://www.pouet.net/ warez世界顶级压缩作品网站

  2. Python: lambda, map, reduce, filter

    在学习python的过程中,lambda的语法时常会使人感到困惑,lambda是什么,为什么要使用lambda,是不是必须使用lambda? 下面就上面的问题进行一下解答. 1.lambda是什么? ...

  3. 一款很好的日程安排插件fullcalendar 非常适合OA等系统

    1.插件下载 http://arshaw.com/fullcalendar/download/ 2. <!DOCTYPE html> <meta http-equiv="C ...

  4. Android笔记之启动界面的设置

    默认情况下,启动界面是白屏 我们自定义一个启动界面如下,3秒钟后进入主界面并结束启动页 SplashActivity.java package com.bu_ish.myapp; import and ...

  5. log4j 配置文件详解

    [1]从零开始 a). 新建Java Project>>新建package>>新建java类: b). import jar包(一个就够),这里我用的是log4j-1.2.14 ...

  6. 【Redis笔记(四)】 Redis数据结构 - list链表

    原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50573605 经过前面的介绍,我们学习了Redis中string字符串.hash ...

  7. 数据库之Oracle

    数据库之Oracle 一. 用户的管理 1. 用户就是好比公司的某个人,而权限是这个人能在公司做什么,他的角色就是说明他的职位. 2. 用户的权限分为: 系统权限:对别的用户的管理操作. 对象权限:对 ...

  8. Python: PS 图像调整--饱和度调整

    本文用 Python 实现 PS 图像调整中的饱和度调整算法,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/detail ...

  9. 51Nod - 1295:XOR key (可持久化Trie求区间最大异或)

    给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求ALL 至 ARR 这R - L + 1个数中,与X 进行异或运算(Xor),得到的最大值 ...

  10. mybatis编写流程(老版本的方式,新版本用接口式编程)

    1.根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 有数据源一些运行环境信息2.sql映射文件:配置了每一个sql,以及sql的封装规则等.  3.将sql映射文件注 ...