【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;
}
树莓派安装snowboy 1、树莓派换源 参考链接:https://blog.youkuaiyun.com/qq_43556844/article/details/113615915 2、更新pip3 参考链接:https://blog.youkuaiyun.com/qq_43556844/article/details/113616214 3、存取麦克风 我们使用PortAudio作为音频输入/输出的跨平台支持。我们还使用sox作为快速实用程序来检查麦克风设置是否正确。 sudo apt-get install python-pyaudio python 阅读详情

相关推荐

Ubuntu 22.04 安装 IsaacLab 2.1.0

本文介绍了IsaacLab的完整安装流程:1)创建Python3.10虚拟环境;2)安装PyTorch2.5.1(CUDA11.8);3)升级pip并安装IsaacSim4.5.0;4)克隆IsaacLab仓库;5)运行安装脚本(需接受EULA)。若遇cmake缺失错误,需执行sudo apt安装。安装完成后可通过Ant-v0训练任务验证,成功运行后将显示IsaacSim窗口和训练完成提示。注意:IsaacSim不同版本可共存于不同环境。

weixin_47880303的博客 2224

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

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

Falcon的博客 883

【高级-RAG-优化方法】

本文介绍了两种优化RAG(检索增强生成)系统的高级方法。第一部分介绍KnowFlow项目,它采用父子分块技术,将文档分为父分块(800-1500字符)和子分块(200-400字符),通过精确匹配子分块再返回父分块内容来保证搜索精确性和上下文完整性。第二部分探讨Milvus的多种增强技术,包括查询增强(如假设问题生成、回溯提示)、索引增强(自动合并块、分层索引)、检索器增强(句子窗口检索、元数据过滤)、生成器增强(提示压缩、块排序)以及管道增强(自我反省、代理查询路由)。这些方法共同提升了RAG系统的检索效率

weixin_48585108的博客 960

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

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

weixin_34174132的博客 174

振动能量采集技术:从原理到实战,破解物联网供电难题

能量采集技术旨在捕获环境中的废弃能量(如机械振动、热能、光能)并将其转化为电能,其核心原理在于通过压电、电磁、静电或摩擦电等物理效应实现能量形式的转换。这项技术的核心价值在于为物联网(IoT)中难以布线或更换电池的分布式传感器节点、植入式医疗设备等提供近乎永续的电力解决方案,从而解决物联网部署的“最后一米供电”瓶颈。其应用场景广泛覆盖工业预测性维护、结构健康监测、可穿戴设备及消费电子等领域。本文聚焦于振动能量采集这一细分方向,深入剖析了压电式、电磁式、电容式及摩擦纳米发电机(TENG)等主流技术路线的实战考

weixin_42660494的博客 569

【虚幻引擎UE】UE5 仅需6步轻松实现关卡顺滑切换

【虚幻引擎UE】UE5 仅需6步轻松实现关卡切换

灵境引路人 2万+

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

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

Mogician_Evian的博客 377

推荐系统[九]项目技术细节讲解z2:搜索Query理解[Term Weight、Query 改写、同义词扩写]和语义召回技术

在 pooling 方法上,我们也尝试过不同层 pooling,或者在多层上增加 attention 聚合 BERT 多层结果,效果和最后一层所有 token 做 average pooling 相当。损失函数方面,在排序阶段使用pairwise比 pointwise 损失函数的效果会更好。

丨汀、的博客 1109

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

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

TYB的博客 265

Android 13 RK3588 编译烧写实录全程

本文详细记录了RK3588主板在Android 13系统下的各项功能测试与编译过程。主要内容包括:1)网络功能测试(以太网、WiFi、蓝牙连接);2)外设接口测试(耳机、麦克风、USB、TF卡);3)硬件功能验证(RTC时钟、ADC采样、MIPI摄像头);4)系统设置(手势导航、开发者选项);5)Android 13 SDK编译环境搭建与源码获取方法。通过图文并茂的方式展示了各功能的配置方法、操作步骤和测试结果,为开发者提供了全面的参考指南。

hnjzfwy的博客 239

【DRAM存储器六十一】LPDDR5介绍--LPDDR5/5X/4/4X IO结构

简述LPDDR5/5X/4/4X IO结构及等效电路下的VREF理论值计算

highman110的博客 484

[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

利用dpabi和restplus提取ROI灰质体积学习笔记

目录前言一、数据准备二、利用dpabi提取ROI灰质体积三、restplus提取ROI灰质体积 前言 我利用SPM/CAT12进行灰质、白质、脑脊液分割之后分别已经得到各自的图像文件,在全脑水平已经做了统计分析。如果还想要进一步进行ROI的统计分析或者与量表等临床资料做相关分析,就需要提取ROI灰质体积。几个月没动过这数据了,突然心血来潮想学一下如何提取ROI灰质体积,以此篇博客记录我的提取ROI灰质体积学习过程。提取ROI灰质体积的方法及软件有许多种,本人尝试了dpabi和restplus。 一、数据准备

weixin_52073820的博客 9225

【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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

后缀自动机+dp

spinning 332

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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、付费专栏及课程。

余额充值