题面

制杖四合一,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. python之爬虫_模块

    目录 一.requests模块二.Beautifulsoup模块 一.requests模块 1.介绍 Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但 ...

  2. LeetCode 461. Hamming Distance (C++)

    题目: The Hamming distance between two integers is the number of positions at which the corresponding ...

  3. 记事本APP之Alpha报告

    项目名称 记事本APP 项目版本 Alpha版本 负责人 北京航空航天大学计算机学院 Echo软件团队 联系方式 http://www.cnblogs.com/echo-buaa/ 要求发布日期 20 ...

  4. 四则运算App--大总结(已完成)

    1. 贡献分分配(20分) 欧泽波:14分,Android的学习,代码的编写,等等 杨洁华:1分,提供学习资料,框架的设计等等 赵泽嘉:3分,提供学习资料,框架的设计等等 林扬滨:2分,提供学习资料, ...

  5. 第一次spring冲刺第3、4天

    11月14至15日 因为忙于项目的谈论与探究,以及周末的活动变动,使得博客没有时间提交上去,这里补交. 这两天,主要是应对于市场的探究做谈论,我们主要面对什么类型的客户,以及他们最需要的是什么等话题做 ...

  6. 论文《Network in Network》笔记

    论文:Lin M, Chen Q, Yan S. Network In Network[J]. Computer Science, 2013. 参考:关于CNN中1×1卷积核和Network in N ...

  7. 团队作业之四则运算GUI展示

    一.项目Coding.net原码仓库地址:https://git.coding.net/caoying/Teamwork.git 队员: 卢琪:2016011986 曹滢:2016012102 二.P ...

  8. angularJS1笔记-(15)-自定义指令(accordion伸缩菜单原始实现)

    index.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  9. PHP 常用函数总结(四)

    9.PHP常用判断函数 is_bool();//判断是否为布尔型 is_float(); //判断是否为浮点型 is_int(); //判断是否为整型 is_numeric(); //判断是否为数值型 ...

  10. [转帖]Linux 下 DD 命令的使用详解

    https://blog.csdn.net/noviblue/article/details/56012275 一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注 ...