Prefiquence(双指针,动态规划)

文章目录

    • 题目描述
    • 输入格式
    • 输出格式
    • 样例
      • 样例输入 #1
      • 样例输出 #1
      • 样例输入 #2
      • 样例输出 #2
      • 样例输入 #3
      • 样例输出 #3
  • 提示
  • 提交链接
  • 解析
  • 参考代码

题目描述

给您两个二进制字符串 a a a b b b 。二进制字符串是由字符 0 0 0 1 1 1 组成的字符串。

您的任务是确定最大可能的数字 k k k,使得长度为 k k k 的字符串 a a a 的前缀是字符串 b b b 的子序列。

如果 a a a 可以从 b b b 中删除几个(可能是零个或全部)元素,那么序列 a a a 就是序列 b b b 的子序列。

输入格式

第一行包含两个整数 n n n m ( 1 ≤ n , m ≤ 2 ∗ 1 0 5 ) m(1 \leq n,m \leq 2 * 10^5) m(1n,m2105) - 分别是字符串 a a a 的长度和字符串 b b b 的长度。

第二行包含长度为 n n n 的二进制字符串 a a a

第三行包含长度为 m m m 的二进制字符串 b b b

输出格式

输出一个数字 - 最大值 k k k ,使得 a a a 的前 k k k 个字符构成 b b b 的子序列。

样例

样例输入 #1

5 4
10011
1110

样例输出 #1

2

样例输入 #2

3 5
100
11010

样例输出 #2

3

样例输入 #3

3 1
100
0

样例输出 #3

0

提示

样例解释 1 1 1
字符串 10 10 10 1110 1110 1110 的子序列,但字符串 100 100 100 不是。因此答案是 2 2 2

样例解释 2 2 2
a = 100 a=100 a=100 b = 11010 b=11010 b=11010,整个字符串 a a a 是字符串 b b b 的子序列,所以答案为 3 3 3

样例解释 3 3 3
字符串 b b b 不包含 1 1 1,所以答案是 0 0 0

提交链接

https://hydro.ac/d/lp728/p/20

解析

a a a 的前 k k k 个字符,为连续的。可以采用双指针的思想,第一个指针从 a a a 的第一个字符开始,第二个指针从 b b b 的第一个字符开始。 a a a 的指针一直移动尝试和 b b b 匹配,若一个字符匹配, b b b 的指针才会移动。

另外也可以采取动态规划的思想。
让我们定义 d p i dp_i dpi a a a 的最大前缀,它包含在作为子序列的 b 1 , … , b i b_1,…,b_i b1,,bi中。

那么转换过程如下

  • 如果 b i b_i bi 等于 a [ d p i − 1 + 1 ] a[dp_{i−1}+1] a[dpi1+1] ,那么 d p i = d p i − 1 + 1 dp_i=dp_{i−1}+1 dpi=dpi1+1
  • 否则为 d p i = d p i − 1 dp_i=dp_{i−1} dpi=dpi1

答案为 d p m dp_m dpm

参考代码

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int n , m;
string a , b;
int main()
{cin >> n >> m;cin >> a >> b;a = " " + a , b = " " + b;int sum = 0 , j = 1;for(int i = 1; i <= n; i++){for(; j <= m; j++){if(b[j] == a[i]){sum++;j++;break;}}if(j > m)break;}cout << sum << endl;return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 9;
int n , m , dp[maxn];
string a , b; 
int main()
{cin >> n >> m;cin >> a >> b;a = " " + a , b = " " + b;dp[1] = (a[1] == b[1] ? 1 : 0);for(int i = 2; i <= m; i++){if(dp[i - 1] < n && a[dp[i - 1] + 1] == b[i])dp[i] = dp[i - 1] + 1;elsedp[i] = dp[i - 1];}cout << dp[m];return 0;
}

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

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

相关文章

【数据结构与算法】力扣 239. 滑动窗口最大值

题干描述 给你一个整数数组 nums&#xff0c;有一个大小为 k **的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a; nums [1,3,-1,-3,5,3…

代码随想录day56 | 动态规划P16 | ● 583. ● 72. ● 编辑距离总结篇

583. 两个字符串的删除操作 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 示例 1&#xff1a; 输入: word1 "sea", word2 "eat" 输出: 2 解释: 第一步将 &quo…

嵌入式开发常见概念简介

目录 0. 《STM32单片机自学教程》专栏总纲 API Handle(句柄) 0. 《STM32单片机自学教程》专栏总纲 本文作为专栏《STM32单片机自学教程》专栏其中的一部分&#xff0c;返回专栏总纲&#xff0c;阅读所有文章,点击Link: STM32单片机自学教程-[目录总纲]_stm32 学习-CSD…

每日OJ题_贪心算法三⑤_力扣134. 加油站

目录 力扣134. 加油站 解析代码 力扣134. 加油站 134. 加油站 难度 中等 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一…

java设计模式三

工厂模式是一种创建型设计模式&#xff0c;它提供了一个创建对象的接口&#xff0c;但允许子类决定实例化哪一个类。工厂模式有几种变体&#xff0c;包括简单工厂模式、工厂方法模式和抽象工厂模式。下面通过一个简化的案例和对Java标准库中使用工厂模式的源码分析来说明这一模…

SpringBoot3项目打包和运行

六、SpringBoot3项目打包和运行 6.1 添加打包插件 在Spring Boot项目中添加spring-boot-maven-plugin插件是为了支持将项目打包成可执行的可运行jar包。如果不添加spring-boot-maven-plugin插件配置&#xff0c;使用常规的java -jar命令来运行打包后的Spring Boot项目是无法找…

linux笔记--tmux的使用

目录 1--安装tmux 2--创建新会话 3--离开会话 4--查看所有会话 5--进入会话 6--结束会话 1--安装tmux # Ubuntu 或 Debian sudo apt-get install tmux# CentOS 或 Fedora sudo yum install tmux# Mac brew install tmux 2--创建新会话 tmux new -s <session-name&g…

scrapy常用命令总结

1.创建scrapy项目的命令&#xff1a;     scrapy startproject <项目名字> 示例&#xff1a;     scrapy startproject myspider 2.通过命令创建出爬虫文件&#xff0c;爬虫文件为主要的代码文件&#xff0c;通常一个网站的爬取动作都会在爬虫文件中进行编写。 …

Java学习第01天-Java基本内容

目录 单行注释 多行注释 文档注释&#xff08;GPT生成&#xff09; 字面量 分类 使用示例 变量 定义 定义格式 注意事项 数据类型分类 命名指导规范 补充 单行注释 public class note {public static void main(String[] args) {// 单行注释} }多行注释 publ…

FileBird Pro插件下载:革新您的WordPress媒体库管理

WordPress媒体库是您网站的重要组成部分&#xff0c;它存储了所有的图片、视频、文档等文件。但随着网站的扩展&#xff0c;媒体库的管理变得越来越复杂。FileBird Pro插件&#xff0c;作为一款专为WordPress用户设计的媒体库管理工具&#xff0c;以其直观的界面和强大的功能&a…

docker操作使用注意事项

文章目录 一、运行docker二、拉取的镜像存放位置1、查询所有拉取的镜像2、查询所有安装的镜像3、查询docker应用的所有信息 一、运行docker 该命令执行后是在窗口下运行的&#xff0c;关闭或退出后docker应用会停止运行 -p&#xff1a;设置绑定端口映射&#xff0c;10022对应…

JS中浅拷贝和深拷贝的区别

在JavaScript中&#xff0c;浅拷贝和深拷贝是用于复制对象或数组的两种常用方法。它们之间的区别在于复制的程度。 1.浅拷贝&#xff1a;浅拷贝是指创建一个新的对象或数组&#xff0c;将原始对象或数组的引用复制给新的对象或数组。这意味着原始对象和新的对象将共享相同的引…

Elastic 通过 AI 驱动的安全分析改变 SIEM 游戏

作者&#xff1a;Santosh Krishnan, Jennifer Ellard 借助由搜索 AI 提供支持的新攻击发现功能&#xff0c;优先考虑攻击&#xff0c;而不是警报。 传统的安全信息与事件管理系统&#xff08;SIEM&#xff09;在很大程度上依赖屏幕背后的人类才能取得成功。警报、仪表盘、威胁…

Python面向对象编程思想的深入学习

魔术方法的使用 案例体验 class Student:def __init__(self, name, age):self.name nameself.age age# __str__魔术方法, 如果不去写这个方法&#xff0c;那么print输出的则是信息存储的内存地址。def __str__(self):return fStudent类对象&#xff0c;name:{self.name}, ag…

【爬虫】fake_useragent的使用、BeautifulSoup(find()和find_all())

1 fake_useragent 2 BeautifulSoup 3 Beautiful Soup库的find()和find_all() 1 fake_useragent fake_useragent是一个Python库&#xff0c;用于生成随机的用户代理字符串。 用户代理是在HTTP请求中发送给服务器的一种标识&#xff0c;它告诉服务器发送请求的客户端的类型、版本…

PVZ2 植物克僵尸【第二期】

众所周知&#xff0c;PVZ2&#xff08;植物大战僵尸2&#xff09;中有许多恶心的僵尸&#xff0c;而我们不得不派出它们的————克星&#xff01;&#xff08;*为建议方法&#xff09; 5.战机小鬼 战机小鬼&#xff0c;恶心会发射子弹&#xff0c;所以&#xff1a; 1&…

Ubuntu18.04设置SSH密钥登录

我们一般使用 VSCode 、MobaXterm、PuTTY等 SSH 客户端来远程管理 Linux 服务器。但是&#xff0c;一般的密码方式登录&#xff0c;容易有密码被暴力破解的问题。所以&#xff0c;一般我们会将 SSH 的端口设置为默认的 22 以外的端口&#xff0c;或者禁用 root 账户登录。但是即…

Autosar NvM配置-手动配置Nvblock及使用-基于ETAS软件

文章目录 前言NvDataInterfaceNvBlockNvM配置SWC配置RTE Mapping使用生成的接口操作NVM总结前言 NVM作为存储协议栈中最顶层的模块,是必须要掌握的。目前项目基本使用MCU带的Dflash模块,使用Fee模拟eeprom。在项目前期阶段,应该充分讨论需要存储的内容,包括应用数据,诊断…

JSP企业快信系统的设计与实现参考论文(论文 + 源码)

【免费】JSP企业快信系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89277688 JSP企业快信系统的设计与实现 摘 要 计算机网络的出现到现在已经经历了翻天覆地的重大改变。因特网也从最早的供科学家交流心得的简单的文本浏览器发展成为了商务和信息的中心…

OSPF邻居建立后学不到路由?新手做项目最容易犯这个错!

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 你们好&#xff0c;我的网工朋友。 新手经常会在配置OSPF时遇到一些棘手的问题&#xff0c;比如由于接口网络类型配置不一致导致的邻居关系建立失…