P4112 [HEOI2015] 最短不公共子串

news/2025/1/24 16:26:20/文章来源:https://www.cnblogs.com/LG017/p/18689720

P4112 [HEOI2015] 最短不公共子串、

题目描述

在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。

下面给出一些定义:

  • 一个串的“子串”指的是它的连续的一段,例如 bcdabcdef 的子串,但 bde 不是。
  • 一个串的“子序列”指的是它的可以不连续的一段,例如 bdeabcdef 的子串,但 bdd 不是。

下面,给两个小写字母串 \(a, b\),请你计算:

  1. \(a\) 的一个最短的子串,它不是 \(b\) 的子串。
  2. \(a\) 的一个最短的子串,它不是 \(b\) 的子序列。
  3. \(a\) 的一个最短的子序列,它不是 \(b\) 的子串。
  4. \(a\) 的一个最短的子序列,它不是 \(b\) 的子序列。

数据规模与约定

  • 对于 \(100\%\) 的数据,保证 \(a\)\(b\) 的长度都不超过 \(2000\)

Solution:

首先,我们不仅要构造后缀自动机,还要构造一个叫做序列自动机的东西,构造方法也十分简单,我们只需要记录每个字符最后一次出现的位置 \(last_c\) 每次插入一个的时候枚举所有字符 \(p=last_i\) ,然后不断的跳 \(p=fa_p\) 直到其出现过 \(ch[p][c]\)

然后在这两个自动机上面同步跑 bfs 就好了,至于四遍分别这么跑详见代码。

Code:

#include<bits/stdc++.h>
const int N=4005;
using namespace std;
struct SAM{int ch[N][26],fa[N],len[N];int last,cnt;void init(){last=cnt=1;}void insert(int c){int p=last,q=++cnt;last=q;len[q]=len[p]+1;for(;p&&!ch[p][c];p=fa[p])ch[p][c]=q;if(!p){fa[q]=1;return ;}int x=ch[p][c];if(len[x]==len[p]+1){fa[q]=x;return ;}int y=++cnt;len[y]=len[p]+1;fa[y]=fa[x];for(int i=0;i<26;i++)ch[y][i]=ch[x][i];fa[x]=fa[q]=y;for(;p&&ch[p][c]==x;p=fa[p])ch[p][c]=y;}
}SA,SB;
struct SQM{int ch[N][26],fa[N],last[26];int cnt;void init(){cnt=1;for(int i=0;i<26;i++)last[i]=1;}void insert(int c){int p=last[c],q=++cnt;fa[q]=p;for(int i=0;i<26;i++)for(int x=last[i];x&&!ch[x][c];x=fa[x])ch[x][c]=q;last[c]=q;}
}SQA,SQB;
struct Node{int x,y,len;
};
int vis[N][N];
int bfs(int opt)
{queue<Node> Q;Q.push({1,1,0});vis[1][1]=opt;while(!Q.empty()){int x=Q.front().x,y=Q.front().y,len=Q.front().len;Q.pop();for(int i=0,xx,yy;i<26;i++){xx=(opt<=2 ? SA.ch[x][i] : SQA.ch[x][i]),yy=(opt&1? SB.ch[y][i] : SQB.ch[y][i]);if(xx&&yy){if(vis[xx][yy]==opt)continue;//if(opt==2)cout<<char(i+'a')<<" "<<x<<" "<<y<<":"<<xx<<" "<<yy<<" "<<len+1<<"\n";vis[xx][yy]=opt;Q.push({xx,yy,len+1});}if(xx&&!yy) return len+1;}}return -1;
}
int n,m;
char A[N],B[N];
int ans[5];
void work()
{scanf("%s%s",A+1,B+1);n=strlen(A+1);m=strlen(B+1);SA.init(),SB.init(),SQA.init(),SQB.init();for(int i=1;i<=n;i++)SA.insert(A[i]-'a'),SQA.insert(A[i]-'a');for(int i=1;i<=m;i++)SB.insert(B[i]-'a'),SQB.insert(B[i]-'a');ans[1]=bfs(1);ans[2]=bfs(2);ans[3]=bfs(3),ans[4]=bfs(4);for(int i=1;i<=4;i++)printf("%d\n",ans[i]);
}
int main()
{//freopen("sus.in","r",stdin);freopen("sus.out","w",stdout);work();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/874779.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P4070 [SDOI2016] 生成魔咒

P4070 [SDOI2016] 生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 \(1,2\) 拼凑起来形成一个魔咒串 \([1,2]\)。 一个魔咒串 \(S\) 的非空字串被称为魔咒串 \(S\) 的生成魔咒。 例如 \(S=[1,2,1]\) 时,它的生成魔咒有 \([1],[2],[1…

深入探讨触发器的创建与应用:数据库自动化管理的强大工具

title: 深入探讨触发器的创建与应用:数据库自动化管理的强大工具 date: 2025/1/24 updated: 2025/1/24 author: cmdragon excerpt: 触发器是一种强大的数据库对象,它能够在特定事件发生之前或之后自动执行一组SQL语句。作为一种自动化管理工具,触发器在许多数据库管理场景…

Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架

Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架 Rapid7 Penetration testing, released Jan 22, 2025 请访问原文链接:https://sysin.org/blog/metasploit-pro-4/ 查看最新版。…

VS.net中快捷键收缩和展开代码段

i. Ctrl-M-O 折叠所有方法 ii. Ctrl-M-P 展开所有方法并停止大纲显示(不可以再折叠了) iii. Ctrl-M-M 折叠或展开当前方法 iv. Ctrl-M-L展开所有方法 其他的快捷方式:怎样跳转到指定的某一行? 两种方法:Ⅰ. Ctrl+G Ⅱ. 双击状态栏中的行号2.. 怎样创建矩形选区? 两…

查看Resources.resx的三种方式

同一个Resources.resx文件在Visual Studio 中可以以多种方式查看, 但某一天遇到了问题, 只能以资源浏览器的方式查看, 期初还以为是Visual Studio升级加入的新功能, 怎么都无法打开设计器, 在Resources.resx文件右键菜单中看不到下面的菜单项,经过一些列的摸索, 发现设置…

Vmware 虚拟机克隆注意事项-CentOS7

1.克隆后修改MAC地 2.修改 UUID,UUID克隆虚拟机后一般是一样的,需要进行修改 输入命令uuidgen,将生成的UUID写入ifcfg-ens33 【文件位置:/etc/sysconfig/network-scripts/ifcfg-ens33】 【我克隆的时候并没有修改,但是也一样可以联网,不知道为啥】 3.修改主机名 先临时修…

autocad Ribbon创建的一种新思路

之前开发的功能相对简单, 一个RibbonTab就把相关的功能展示出来了。 目前着手准备开发的功能, 需要多个RibbonTab, 且不想显示AutoCAD或Civil 3D自身的RibbonTab, 曾经想模拟3d3s的样子来切换RibbonTab, 但发现3d3s是将AutoCAD原生的Cuix和自己的RibbonTab结合到一起, 对…

Solon Cloud Gateway 开发:导引

Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。 分布式网关的特点(相对于本地网关):提供服务路由能力 提供各种拦截支持1、分布式网关推荐 建议使用专业的分布…

Mac安装Prometheus + Grafana

一、安装Prometheus 1、下载安装 brew install prometheus2、安装路径 /opt/homebrew/Cellar/prometheus/3.1.0 3、修改配置文件 默认配置文件路径:/opt/homebrew/etc/prometheus.yml global:scrape_interval: 15sscrape_configs:- job_name: "prometheus"static_co…

Python基础6——装饰器(续) 递归 模块

1.函数1.1 参数当默认参数的值为可变类型时慎用# 不推荐使用以下代码 def func(data, value=[]):pass可以将默认参数的值改为None# 推荐使用以下代码 def func(data, value=None):if not value:value = []案例def func(data, value=[]):value.append(data)return valuev1 = fun…

C# Winform 在 Pancel 上绘制矩形

在C#的WinForms应用程序中,Panel控件本身不直接支持绘图功能,因为它不是一个绘图控件。不过,你可以通过在Panel上覆盖(override)OnPaint方法或者使用Graphics对象来在Panel上绘制图形。下面是如何实现这两种方法的示例: 方法1:覆盖OnPaint方法 可以通过重写Panel的OnPai…

SpringBoot使用SSE流,打tar包发版后出现问题

SpringBoot使用SSE流,打tar包发版后出现问题 以下纯个人实践,如有问题,还望指正~ 出现的问题 出现原因:本地调试SSE推送数据没有问题,但是通过打包为tar包发版之后,出现了以下报错: 主要问题就是: java.lang.IllegalArgumentException: Async support must be enabled …