【HEOI2015】最短不公共子串

LOJ「HEOI2015」最短不公共子串 题解 「HEOI2015」最短不公共子串 题目大意: 给两个小写字母串 A,BA, BA,B 请你计算: AAA 的一个最短的子串,它不是 BBB 的子串。 AAA 的一个最短的子串,它不是 BBB 的子序列。 AAA 的一个最短的子序列,它不是 BBB 的子串。 AAA 的一个最短的子序列,它不是 BBB 的子序列。 简单题。看了一下网上的题解有用 dpdpdp 的。但是既然是最小长度可以考虑使用广度优先搜索。 首先这个可以保证找到的第一个就是最优解。其次因为我们两个自动机都是按照深度向下排序的,那么本质 阅读详情

时间限制 : 1000 MS 空间限制 : 265536 KB

问题描述

在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。
一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是。
一个串的“子序列”指的是它的可以不连续的一段,例如bde是abcdef的子串,但bdd不是。
下面,给两个小写字母串A,B,请你计算:
(1) A的一个最短的子串,它不是B的子串
(2) A的一个最短的子串,它不是B的子序列
(3) A的一个最短的子序列,它不是B的子串
(4) A的一个最短的子序列,它不是B的子序列

输入格式

有两行,每行一个小写字母组成的字符串,分别代表A和B。

输出格式

输出4行,每行一个整数,表示以上4个问题的答案的长度。如果没有符合要求的答案,输出-1.

样例输入

aabbcc
abcabc

样例输出

2
4
2
4

提示

对于100%的数据,A和B的长度都不超过2000

题解

一道大板题……
对A,BA,B两字符串建序列自动机和后缀自动机。根据序列自动机与后缀自动机的性质,从自动机的根出发到自动机上任意一点为原字符串的一个子序列(序列自动机)或子串(后缀自动机)。因此对题目中的四个问都只需在两串的对应机子上跑宽搜。若某状态,串AA的机子能到达,而B不能,即为答案。注意剪枝!!!

代码

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=4e3+5;
int n,m,vis[maxn][maxn];
char A[maxn],B[maxn];
struct Suffix_Automaton{
    int rt,tot,Last,par[maxn],maxx[maxn],son[maxn][30];
    void init()
    {
        memset(maxx,0,sizeof(maxx));
        memset(par,0,sizeof(par));
        memset(son,0,sizeof(son));
        rt=tot=Last=0;
    }
    int Add(int x)
    {
        maxx[++tot]=x;
        return tot;
    }
    void Insert(char c)
    {
        int t=c-'a',p,q,np,nq;
        p=Last,np=Add(maxx[p]+1);
        for(;p&&(!son[p][t]);p=par[p]) son[p][t]=np;
        if(!p) par[np]=rt;
        else
        {
            q=son[p][t];
            if(maxx[q]==maxx[p]+1) par[np]=q;
            else
            {
                nq=Add(maxx[p]+1);
                memcpy(son[nq],son[q],sizeof(son[q]));
                par[nq]=par[q],par[q]=par[np]=nq;
                for(;p&&son[p][t]==q;p=par[p]) son[p][t]=nq;
            }
        }
        Last=np;
    }
}SUA,SUB;
struct Squence_Automaton{
    int rt,tot,Last[30],par[maxn],son[maxn][30];
    void init()
    {
        memset(Last,0,sizeof(Last));
        memset(par,0,sizeof(par));
        memset(son,0,sizeof(son));
        rt=tot=1;
        for(int i=0;i<26;i++) Last[i]=rt;
    }
    void Insert(char c)
    {
        int t=c-'a';
        par[++tot]=Last[t];
        for(int i=0;i<26;i++)
            for(int j=Last[i];j&&!son[j][t];j=par[j]) son[j][t]=tot;
        Last[t]=tot;
    }
}SQA,SQB;
struct node{
    int a,b,c;
    node(int a,int b,int c):a(a),b(b),c(c){}
};
int BFS1()
{
    queue<node> q;
    q.push(node(SUA.rt,SUB.rt,0));
    while(!q.empty())
    {
        int pa=q.front().a,pb=q.front().b,step=q.front().c;
        q.pop();
        if(vis[pa][pb]==1) continue;
        vis[pa][pb]=1;
        for(int i=0;i<26;i++)
        {
            if(SUA.son[pa][i]&&SUB.son[pb][i]) q.push(node(SUA.son[pa][i],SUB.son[pb][i],step+1));
            if(SUA.son[pa][i]&&!SUB.son[pb][i]) return step+1;
        }
    }
    return -1;
}
int BFS2()
{
    queue<node> q;
    q.push(node(SUA.rt,SQB.rt,0));
    while(!q.empty())
    {
        int pa=q.front().a,pb=q.front().b,step=q.front().c;
        q.pop();
        if(vis[pa][pb]==2) continue;
        vis[pa][pb]=2;
        for(int i=0;i<26;i++)
        {
            if(SUA.son[pa][i]&&SQB.son[pb][i]) q.push(node(SUA.son[pa][i],SQB.son[pb][i],step+1));
            if(SUA.son[pa][i]&&!SQB.son[pb][i]) return step+1;
        }
    }
    return -1;
}
int BFS3()
{
    queue<node> q;
    q.push(node(SQA.rt,SUB.rt,0));
    while(!q.empty())
    {
        int pa=q.front().a,pb=q.front().b,step=q.front().c;
        q.pop();
        if(vis[pa][pb]==3) continue;
        vis[pa][pb]=3;
        for(int i=0;i<26;i++)
        {
            if(SQA.son[pa][i]&&SUB.son[pb][i]) q.push(node(SQA.son[pa][i],SUB.son[pb][i],step+1));
            if(SQA.son[pa][i]&&!SUB.son[pb][i]) return step+1;
        }
    }
    return -1;
}
int BFS4()
{
    queue<node> q;
    q.push(node(SQA.rt,SQB.rt,0));
    while(!q.empty())
    {
        int pa=q.front().a,pb=q.front().b,step=q.front().c;
        q.pop();
        if(vis[pa][pb]==4) continue;
        vis[pa][pb]=4;
        for(int i=0;i<26;i++)
        {
            if(SQA.son[pa][i]&&SQB.son[pb][i]) q.push(node(SQA.son[pa][i],SQB.son[pb][i],step+1));
            if(SQA.son[pa][i]&&!SQB.son[pb][i]) return step+1;
        }
    }
    return -1;
}
int main()
{
    scanf("%s%s",A+1,B+1),n=strlen(A+1),m=strlen(B+1);
    SQA.init(),SUA.init(),SUA.Last=SUA.rt=SUA.Add(0);
    SQB.init(),SUB.init(),SUB.Last=SUB.rt=SUB.Add(0);
    for(int i=1;i<=n;i++) SUA.Insert(A[i]),SQA.Insert(A[i]);
    for(int i=1;i<=m;i++) SUB.Insert(B[i]),SQB.Insert(B[i]);
    printf("%d\n%d\n%d\n%d\n",BFS1(),BFS2(),BFS3(),BFS4());
    return 0;
}
PyFluent进阶实战:自动化密闭几何(Watertight)网格生成 本文深入探讨了如何利用PyFluent实现自动化密闭几何(Watertight)网格生成。通过Python脚本控制Fluent Meshing工作流,工程师可以高效、一致地完成从几何导入、局部尺寸定义、面网格生成到边界层设置和体网格输出的全过程,从而将复杂的CFD前处理工作转化为可重复、可集成的自动化流程,极大提升仿真效率和知识复用性。 阅读详情

相关推荐

保姆级教程:用CANoe手把手复现ECU刷写全流程(含BootLoader三阶段详解)

本文提供了一份详细的CANoe ECU刷写实战指南,涵盖BootLoader三阶段的深度解析。从实验环境搭建到预编程、主编程及后编程阶段,逐步讲解ECU刷写的关键步骤和隐藏逻辑,特别强调UDS诊断和CAN通信的精确控制,帮助开发者掌握ECU刷写的核心技术。

weixin_29234423的博客 531

牛客 - Shortest Common Non-Subsequence(dp+序列自动机)

题目链接:点击查看 题目大意:根据最长公共子序列抛出一个新定义,“ 最短非公共子序列 ”,假设给定了字符串 s1 和 s2,设 s 为 s1 和 s2 的“最短非公共子序列”,那么 s 需要满足: s 不是 s1 的子序列 s 不是 s2 的子序列 满足上述两个条件下,s 尽可能短 现在给出两个 01 串,输出其“最短非公共子序列”,如果有多个答案,输出字典序最小的 题目分析:动态规划问题,因为题目中存在着字典序最小的这个限制,此类问题可以参考:CodeForces - 1341D 所以可以反向

Falcon的博客 883

【STM32/GD32】Keil uVision生成bin文件:从编译选项到Bootloader升级实战

本文详细讲解了如何在Keil uVision中配置STM32/GD32工程,使其在编译后自动生成Bootloader升级所需的bin文件。通过解析fromelf工具的使用、构建后命令的配置以及内存布局规划,深入阐述了bin文件在固件升级中的核心作用,并提供了串口Bootloader的实战框架与常见问题解决方案。

weixin_29190169的博客 394

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

题目描述 在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是。 一个串的“子序列”指的是它的可以不连续的一段,例如bde是abcdef的子串,但bdd不是。 下面,给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是...

weixin_34174132的博客 174

ST-Link使用教程

关于使用ST-Link烧录.hex文件教程。以及报错解决!适合刷ARM,使用STM32的教程!

qq_42977675的博客 1万+

第3章 zynq MII转GMII的配置和EMIO UART0的配置

本文介绍了在Vivado工程中实现MII转GMII接口适配的过程,同时配置EMIO UART0接口。主要内容包括:修改PS IP核添加UART0接口,使用concat IP核进行信号整合,调整GMII信号引脚连接,添加约束文件定义引脚映射,并最终生成bit流文件。通过详细的操作截图和TCL约束代码,展示了从硬件配置到生成可编程文件的完整流程,为Zynq平台开发提供了实用参考。

qq_36517072的博客 903

NKOJ 4022(HEOI 2015)最短不公共子串(后缀自动机+序列自动机+dp)

P4022 [HEOI2015]最短不公共子串 问题描述 在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是。 一个串的“子序列”指的是它的可以不连续的一段,例如bde是abcdef的子串,但bdd不是。 下面,给两个小写字母串A,B,请你计算: ...

Mogician_Evian的博客 377

基于Simulink的超级电容快速响应特性建模与仿真

本文介绍了基于Simulink的超级电容快速响应特性建模与仿真方法。主要内容包括:超级电容的工作原理、一阶RC等效电路模型及其动态电压方程;通过Simulink搭建超级电容模型的两种方法(Simscape Electrical推荐方案和基础模块透明教学方案);仿真100A×100ms放电脉冲下的电压响应特性,并与锂电池进行动态对比;分析超级电容在混合储能系统中的功率分配优势。文章还提供了工程实践要点和扩展方向,如电压均衡、温度影响评估以及与DC-DC变换器集成等。通过建模实践,验证了超级电容在毫秒级响应、高

xiaoheshang_123的博客 98

[BZOJ]4032: [HEOI2015]最短不公共子串 SAM+DP+hash

Description 在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是。 一个串的“子序列”指的是它的可以不连续的一段,例如bde是abcdef的子串,但bdd不是。 下面,给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的...

TYB的博客 265

【医学图像处理】X-ray成像之X射线的产生

【医学图像处理】X-ray成像之X射线的产生 概述 电流流过钨丝,并将其加热。 随着加热,增加的能量使电子能够通过热电子发射从灯丝中释放出来。 电子被吸引到带正电的阳极,并以由管电位(电压)确定的最大能量撞击钨靶。 当电子轰击目标时,它们通过轫致辐射和特有的相互作用将能量转换为热量(99%)和X射线光子(1%)。 X射线光子以一束能量(X射线光谱)从光束中释放出来,构成X射线图像形成的基础。 设备 阴极 灯丝 用细的(0.2毫米)钨丝制成,因为钨: 原子序数高(A 184,Z 74) 是良好的热

ZhangPY的专栏 2358

20、微电网系统的系统框架、建模与控制架构解析

本文详细解析了微电网系统的系统框架、建模方法以及控制架构。文章首先介绍了在系统的系统(SoS)框架下,微电网如何通过微控制器(MC)和微电网中央控制器(MGCC)协调运行,并支持并网与孤岛模式下的高效能量管理。随后,针对微电网的关键组件,包括微涡轮机、光伏太阳能电池和风力涡轮机,提供了详细的数学建模分析。最后,探讨了微电网的控制架构设计,涵盖分层控制和共识控制策略,以实现系统的高效、稳定运行,满足日益增长的能源需求与市场要求。

elastic6hunter的博客 206

[HEOI2015]最短不公共子串

最短不公共子串 题解 不明白那个出题人无聊到把四个问题放到一个问题中。 不过出题人既然这样做了,我们就分四个问题来讨论吧。 反正四个都是dp。 Problem 1st 应该是一个很容易想到的dp。 容易发现,最短不公共子序列的长度就是最短的无法继续向后延伸的公共子序列的长度。 后者可以通过简单dp求出。 令dpi,jdp_{i,j}dpi,j​表示aaa串以第iii个字符结尾,bbb串以第jjj个字符结尾的最长公共子序列长度。 易得状态转移方程式: dpi,j=dpi−1,j−1+1    (ai=bj)d

StaroForgin的博客 446

Spring Boot:如何快速搭建一个高性能微服务架构?

通过本文的详细步骤,我们成功搭建了一个高性能的微服务架构。Spring Boot 和 Spring Cloud 提供了强大的工具链,使得开发者能够快速实现服务注册与发现、负载均衡、熔断器与降级机制等功能。同时,通过数据库连接池、Redis 缓存和异步处理等优化手段,进一步提升了系统的性能和可靠性。希望本文能够帮助你快速入门 Spring Boot 微服务架构的搭建,并为实际项目提供参考。如果你有任何问题或建议,欢迎在评论区留言!

shrgegrb的博客 1013

【BZOJ4032】【HEOI2015】最短不公共子串 后缀自动机

题解: T1: 我们按长度bfs所有的串,对于每个串记录A串中终点位置、B串中终点位置(B串中位置由B的后缀自动机中节点标号表示)、长度——(x,y,l)(x,y,l)。 然后 (x,y,l)(x,y,l) 可以 O(1)O(1) 转移到 (x+1,son[y,stringax+1−′a′],l+1)(x+1,son[y,stringa_{x+1}-'a'],l+1) 时间复杂度 O(

辗转山河弋流歌 3079

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

[BZOJ4032] [HEOI2015] 最短不公共子串 - 后缀自动机,序列自动机,BFS

4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 398  Solved: 189 [Submit][Status][Discuss] Description  在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。 一个串的“子串”指的是它的连续的一段,例如bcd是ab

whzzt的博客 990

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

bzoj 4032 [HEOI2015]最短不公共子串

后缀自动机+dp

spinning 332

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 428  Solved: 207 [Submit][Status][Discuss] Description  在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。 一个串的“子串”指的是它的连续的一段,例如bcd是ab

CRZbulabula的博客 590

bzoj 4032: [HEOI2015]最短不公共子串 (DP+后缀自动机)

4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 430  Solved: 209 [Submit][Status][Discuss] Description  在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。 一个串的“子串”指的是它的连续的一段,例如bcd是ab

clover_hxy的博客 868

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

4032: [HEOI2015]最短不公共子串 Time Limit:10 SecMemory Limit:256 MBSubmit:446Solved:224[Submit][Status][Discuss] Description 在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。 一个串的“子串”指的是它的连续的一段,例如bcd是abcd...

weixin_30642561的博客 150

【HEOI2015】【BZOJ4032】最短不公共子串

Description在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是。 一个串的“子序列”指的是它的可以不连续的一段,例如bde是abcdef的子串,但bdd不是。 下面,给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B

CreationAugust is 14 years old forever 2018

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

4032: [HEOI2015]最短不公共子串 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4032 Description 在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是。 一个串的“子序列”指的是它的可以不连续的一段,例如b...

weixin_30813225的博客 125

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

4032: [HEOI2015]最短不公共子串 题目:传送门 题解:    陈年老题良心%你赛膜爆嘎爷    当初做题...一眼SAM...结果只会两种直接DP的情况...    情况1: 直接设f[i][j] 表示的是a串的第i个位置和b串的第j个位置开始的最长公共前缀(灵感来源于SA)。然后就枚举开头直接瞎搞啊。。。    情况2: 定义一个last[i][...

weixin_30470643的博客 120

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

luoguP4112 [HEOI2015]最短不公共子串 链接 luogu loj 思路 子串可以用后缀自动机,子序列可以用序列自动机。 序列自动机是啥,就是能访问到所有子序列的自动机。 每个点记录下一个字母最近出现的位置。不过我这里构造是\(O(n^2)\)。 然后进行bfs进行广搜就行了。 注意vis[][]剪枝,要不TLE。 代码 #include <bits/stdc++....

weixin_30819085的博客 124

洛谷P4112 [HEOI2015]最短不公共子串

后缀自动机、序列自动机、dp

ACoder 246
上一篇: 【bzoj2565】最长双回文串
下一篇: 【Hnoi2016 day1】网络
StrideTG
博客等级 码龄9年 4粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值