解题:HEOI 2015 最短不公共子串
制杖四合一,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 最短不公共子串的更多相关文章
- bzoj 4032 [ HEOI 2015 ] 最短不公共子串 —— 后缀自动机+序列自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 序列自动机其实就是每个位置记录一下某字母后面第一个出现位置,为了子序列能尽量长. 对字 ...
- 洛谷 P4112 [HEOI2015]最短不公共子串 解题报告
P4112 [HEOI2015]最短不公共子串 题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的"子串"指的是它的连续的一段,例如bcd是 ...
- 【BZOJ4032】[HEOI2015]最短不公共子串(后缀自动机,序列自动机)
[BZOJ4032][HEOI2015]最短不公共子串(后缀自动机,序列自动机) 题面 BZOJ 洛谷 题解 数据范围很小,直接暴力构建后缀自动机和序列自动机,然后直接在两个自动机上进行\(bfs\) ...
- BZOJ 4032: [HEOI2015]最短不公共子串
4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 446 Solved: 224[Submit][Sta ...
- BZOJ 4032: [HEOI2015]最短不公共子串 后缀自动机 暴力
4032: [HEOI2015]最短不公共子串 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4032 Description 在虐各种最 ...
- bzoj4032: [HEOI2015]最短不公共子串(SAM+DP)
4032: [HEOI2015]最短不公共子串 题目:传送门 题解: 陈年老题良心%你赛膜爆嘎爷 当初做题...一眼SAM...结果只会两种直接DP的情况... 情况1: 直接设f[i][j] 表示的 ...
- luoguP4112 [HEOI2015]最短不公共子串 SAM,序列自动机,广搜BFS
luoguP4112 [HEOI2015]最短不公共子串 链接 luogu loj 思路 子串可以用后缀自动机,子序列可以用序列自动机. 序列自动机是啥,就是能访问到所有子序列的自动机. 每个点记录下 ...
- bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)
bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ...
- BZOJ4032[HEOI2015]最短不公共子串——序列自动机+后缀自动机+DP+贪心
题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...
随机推荐
- 绝对干货!初学者也能看懂的DPDK解析
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由Willko发表于云+社区专栏 一.网络IO的处境和趋势 从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10 ...
- Vue03
5.组件化开发 组件[component] 在网页中实现一个功能,需要使用html定义功能的内容结构,使用css声明功能的外观样式,还要使用js来定义功能的特效,因此就产生了把一个功能相关的[HTML ...
- NO.3_1:自学python之路------番外:第三方库安装、numpy
引言 Python因为pip的存在,使得第三方库的发布和获取都比较方便.并且Python对跨平台的支持,使得其相较于C++,Java更加方便使用.在本文中,将会介绍在Windows中安装第三方库的方法 ...
- linux, configure --prefix 的作用
指定安装路径不指定prefix,则可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc.其它的资源文件放在/usr ...
- web01-helloworld
新建一个Java web项目,名字为web01 在项目中新建一个servlet,名字为SimpleHello 修改doGet()方法,为: public void doGet(HttpServletR ...
- Ubuntu登录界面添加root用户登录选项
1.普通用户登录系统并打开终端 配置root密码 $sudo passwd 切换至root用户 $su root 输入密码 修改以下配置文件 $nano /usr/share/lightdm/ligh ...
- C语言中Union类型的使用方法
转自:http://blog.csdn.net/feimor/article/details/6858103 使用C语言时,常常使用struct,对于union类型却几乎没有用过,只知道它是联合类型, ...
- oracle greatest(),least( ) ,coalesce()
--场景1: select pt, greatest(wm), least(wm) from (select s.producttype pt, wm_concat(s.productid) wm f ...
- wamp 开启短标签支持
1.先使用phpinfo.php文件打印出信息 2.找到Loaded Configuration File 根据他的路径去修改php.ini文件 3.打开php.ini文件,搜索 short_op ...
- 【Web Shell】- 技术剖析中国菜刀 – Part I
这里的中国菜刀不是指切菜做饭的工具,而是中国安全圈内使用非常广泛的一款Webshell管理工具,想买菜刀请出门左拐东门菜市场王铁匠处.中国菜刀用途十分广泛,支持多种语言,小巧实用,据说是一位中国军人退 ...