题面

制杖四合一,HEOI以前居然出这种**题,看来HE还是联考比较好= =

首先对第二个串建SAM

第一个简单,以每个位置为起点在SAM上走,失配时更新答案

第二个先在第二个串上预处理$firs[i][j]$每个字母在位置$i$后最早在$j$出现,然后在第一个串里$n^2$枚举在$firs$上走,失配时更新答案(这是不是就是序列自动机啊=。=

第三个设个$dp[i][j]$表示考虑前$i$个状态为$j$的答案,然后和第一个一样

第四个$dp[i][j]$第二维改为表示第$j$个,然后和第二个一样

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=;
char a[N],b[N];
int l1,l2,tot,lst;
int firs[N][],dp[N][M];
int fth[M],trs[M][],len[M];
void Insert(int ch)
{
int newn=++tot,nde=lst;
lst=newn,len[newn]=len[nde]+;
while(nde&&!trs[nde][ch])
trs[nde][ch]=newn,nde=fth[nde];
if(!nde)
fth[newn]=;
else
{
int tran=trs[nde][ch];
if(len[tran]==len[nde]+)
fth[newn]=tran;
else
{
int rnde=++tot; len[rnde]=len[nde]+;
for(int i=;i<=;i++) trs[rnde][i]=trs[tran][i];
fth[rnde]=fth[tran],fth[tran]=fth[newn]=rnde;
while(nde&&trs[nde][ch]==tran)
trs[nde][ch]=rnde,nde=fth[nde];
}
}
}
void Solve(int typ)
{
int ans=l1;
if(typ==)
{
for(int i=;i<=l1;i++)
{
int nde=;
for(int j=i;j<=l1;j++)
{
nde=trs[nde][(int)a[j]];
if(!nde) {ans=min(ans,j-i+); break;}
}
}
}
if(typ==)
{
for(int i=;i<=l1;i++)
for(int j=;j<=tot;j++)
dp[i][j]=l1; dp[][]=;
for(int i=;i<=l1;i++)
for(int j=;j<=tot;j++)
{
dp[i][j]=min(dp[i][j],dp[i-][j]);
int tran=trs[j][(int)a[i]];
if(!tran) ans=min(ans,dp[i-][j]+);
else dp[i][tran]=min(dp[i][tran],dp[i-][j]+);
}
}
if(typ==)
{
for(int i=;i<=;i++) firs[l2][i]=l2+;
for(int i=l2-;~i;i--)
for(int j=;j<=;j++)
firs[i][j]=(b[i+]==j)?i+:firs[i+][j];
for(int i=;i<=l1;i++)
{
int pos=;
for(int j=i;j<=l1;j++)
{
pos=firs[pos][(int)a[j]];
if(pos>l2) {ans=min(ans,j-i+); break;}
}
}
}
if(typ==)
{
for(int i=;i<=l1;i++)
for(int j=;j<=l2;j++)
dp[i][j]=l1; dp[][]=;
for(int i=;i<=l1;i++)
for(int j=;j<=l2;j++)
{
dp[i][j]=min(dp[i][j],dp[i-][j]);
int fir=firs[j][(int)a[i]];
if(fir>l2) ans=min(ans,dp[i-][j]+);
else dp[i][fir]=min(dp[i][fir],dp[i-][j]+);
}
}
printf("%d\n",ans);
}
int main()
{
scanf("%s%s",a+,b+);
l1=strlen(a+),l2=strlen(b+),tot=lst=;
for(int i=;i<=l1;i++) a[i]-='a';
for(int i=;i<=l2;i++) b[i]-='a';
for(int i=;i<=l2;i++) Insert(b[i]);
for(int i=;i<=;i++) Solve(i);
return ;
}

解题:HEOI 2015 最短不公共子串的更多相关文章

  1. bzoj 4032 [ HEOI 2015 ] 最短不公共子串 —— 后缀自动机+序列自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 序列自动机其实就是每个位置记录一下某字母后面第一个出现位置,为了子序列能尽量长. 对字 ...

  2. 洛谷 P4112 [HEOI2015]最短不公共子串 解题报告

    P4112 [HEOI2015]最短不公共子串 题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的"子串"指的是它的连续的一段,例如bcd是 ...

  3. 【BZOJ4032】[HEOI2015]最短不公共子串(后缀自动机,序列自动机)

    [BZOJ4032][HEOI2015]最短不公共子串(后缀自动机,序列自动机) 题面 BZOJ 洛谷 题解 数据范围很小,直接暴力构建后缀自动机和序列自动机,然后直接在两个自动机上进行\(bfs\) ...

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

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

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

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

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

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

  7. luoguP4112 [HEOI2015]最短不公共子串 SAM,序列自动机,广搜BFS

    luoguP4112 [HEOI2015]最短不公共子串 链接 luogu loj 思路 子串可以用后缀自动机,子序列可以用序列自动机. 序列自动机是啥,就是能访问到所有子序列的自动机. 每个点记录下 ...

  8. bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)

    bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ...

  9. BZOJ4032[HEOI2015]最短不公共子串——序列自动机+后缀自动机+DP+贪心

    题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...

随机推荐

  1. linux一切皆文件之Unix domain socket描述符(二)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.主要用于 ...

  2. linux下自己安装软件做成命令

    安装nodejs,从官网下下来的是一个压缩包,解压下里面有可执行文件.教程上用ln -s [可执行文件的绝对路径] [/usr/local/bin/]建了一个软连接,这样就能直接无视路径,用命令行调用 ...

  3. mail邮件详解

    基础命令学习目录首页 1.配置   vim /etc/mail.rc文件尾增加以下内容 set from=1968089885@qq.com smtp="smtp.qq.com"s ...

  4. 微信小程序开发调试技巧

    1.  查看线上小程序console a.  先打开开发小程序console b.  再打开线上小程序,此时可以查看console

  5. python基础_字符编码

    字符编码的历史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII 阶段二:为了满足中文,中国人定制了GBK 阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的 ...

  6. Linux常用软件安装与配置——目录

    http://blog.csdn.net/clevercode/article/details/45740431

  7. nginx模块学习

    rewrite模块的语法 链接

  8. CodeM Qualifying Match Q1

    问题描述: 具体地说,就是在第二段音频中找到一个长度和第一段音频相等且是连续的子序列,使得它们的 difference 最小.两段等长音频的 difference 定义为: difference = ...

  9. 深入理解JAVA集合系列四:ArrayList源码解读

    在开始本章内容之前,这里先简单介绍下List的相关内容. List的简单介绍 有序的collection,用户可以对列表中每个元素的插入位置进行精确的控制.用户可以根据元素的整数索引(在列表中的位置) ...

  10. 在虚拟机中安装Ubuntu详细过程

    参考:http://blog.csdn.net/u013142781/article/details/50529030