解题: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不是. 一个串的“子序列”指的是它的可以 ...
随机推荐
- 从零开始的Python学习Episode 19——面向对象(2)
面向对象之继承 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又可称 为基类或超类,新建的类称为派生类或子类. 子类会“”遗传”父类的属性,从而解决代码重用问 ...
- iOS 静态库生成(引用第三方SDK、开源库、资源包)
一.静态库创建 打开Xcode, 选择File ----> New ---> Project 选择iOS ----> Framework & Library ---> ...
- TeamWork#1,Week 5,Suggestions for Team Project
我们团队联系到了我们六班的直系学长,并向他咨询了软件工程基础这门课的团队项目相关的问题.他们团队的名字命名为Z-XML,团队中的几个学长也都是我平时所熟识的.虽然学长已经大四,忙着考研工作等各种事务, ...
- json反序列化对象
这个是同事研究的wcf中中根据type类型反序列化json的示例 /// <summary> /// json转对象 /// </summary> /// <param ...
- golang string转json的一些坑
先带来点冷知识,不知道大家知不知道,反正我刚知道... 大佬们都知道怎么在string中给string类型赋值带双引号的字符串,没错就是用反斜杠,如下: msg := "{\"na ...
- 小学四则运算结对项目报告【GUI】
写在前面 这次的结对项目我做了很长时间,感触也很多.在这次项目中我使用了Java GUI作为和用户的交互方式,但是在上Java课的时候我对GUI和事件驱动这里并没有学的多好,可能是当时对编程还没有什么 ...
- Windows Apache(ApacheHaus)安装配置教程
1,Apache下载 选择一个版本,点击Download 点击File For Microsoft Windows 由于Apache HTTP Server官方不提供二进制(可执行)的发行版,所以我们 ...
- synchronized、锁、多线程同步的原理是咋样
先综述个结论: 一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互斥,而对象的wait()和notify()方法才提供线程的同步功能. 一般说synch ...
- 关于localStorage 应用总结
window.localStorage 设置数据几种方式 1.localStorage.setItem('name',c); 2.localStorage.name=c; 3.localStorage ...
- sql中详解round(),floor(),ceiling()函数的用法和区别?
round() 遵循四舍五入把原值转化为指定小数位数,如:round(1.45,0) = 1;round(1.55,0)=2floor()向下舍入为指定小数位数 如:floor(1.45,0)= 1; ...