121. 小红的区间翻转(卡码网周赛第二十五期(23年B站笔试真题))

题目链接
121. 小红的区间翻转(卡码网周赛第二十五期(23年B站笔试真题))

题目描述

小红拿到了两个长度为 n 的数组 a 和 b,她仅可以执行一次以下翻转操作:选择a数组中的一个区间[i, j],(i != j),将它们翻转。例如,对于 a = [2,3,4,1,5,6],小红可以选择左闭右闭区间[2,4],数组 a 则变成[2,3,5,1,4,6]。
小红希望操作后 a 数组和 b 数组完全相同。请你告诉小红有多少种操作的方案数。
初始 a 数组和 b 数组必定不相同。

输入

第一行输入一个正整数 n,代表数组的长度;
第二行输入 n 个正整数 ai;
第三行输入 n 个正整数 bi。

输出

选择区间的方案数。

样例1输入

4
1 2 3 1
1 3 2 1

样例1输出

2

样例2输入

4
1 1 1 1
1 1 1 1

样例2输出

6

样例3输入

10
19 2 13 71 14 14 71 40 16 23
19 2 13 71 14 14 71 40 16 23

样例3输出

2

提示

数据范围
1 ≤ n, ai ,bi ≤ 5000
在示例1中:
将 1 2 3 1 中的 2 3 进行翻转,得到 1 3 2 1。
将 1 2 3 1 整个进行翻转,得到 1 3 2 1。
所以最终结果是 2。

在这里插入图片描述
在这里插入图片描述

题解1(C++版本)

// 区间dp
#include<bits/stdc++.h>
using namespace std;
const int N = 5010;

int n, a[N], b[N], ans;
bool dp1[N][N]; // dp1[i][j]为1表示将数组a的区间[i,j]进行翻转后,使得数组a和数组b这段区间相同
bool dp2[N][N]; // dp2[i][j]为1表示将数组a的区间[i,j]与数组b这段区间相同
int main(){
    scanf("%d", &n);
    
    for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++) scanf("%d", &b[i]);
    for(int i = 1; i <= n; i++) dp2[i][i] = dp1[i][i] = true;
    for(int len = 2; len <= n; len++){ // 枚举区间长度
        for(int i = 1; i + len - 1 <= n; i++){ // 枚举区间左端点
            int j = i + len - 1; // 枚举区间右端点
            if((a[i] == b[j]) && (a[j] == b[i])){ // 将数组a的区间[i,j]进行翻转
                if(i + 1 < j) dp1[i][j] = dp1[i + 1][j - 1];
                else dp1[i][j] = true; // i和j相邻
            }
            if((a[i] == b[i]) && (a[j] == b[j])){ // 不将数组a的区间[i,j]进行翻转
                if(i + 1 < j) dp2[i][j] = dp2[i + 1][j - 1];
                else dp2[i][j] = true; // i和j相邻
            }
        }
    }
    for(int len = 2; len <= n; len++){
        for(int i = 1; i + len - 1 <= n; i++){
            int j = i + len - 1;
            bool f1 = true, f3 = true;
            if(i > 1) f1 = dp2[1][i - 1];
            if(j < n) f3 = dp2[j + 1][n];
            if(f1 && dp1[i][j] && f3) {
                ans++;
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}

题解2(C++版本)

// 字符串哈希
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long uLL;
 
const int N = 5005;
const uLL base = 2333;
 
uLL pw[N] = {1}, hs1[N], hs2[N], hs; // hs1表示正向求哈希,hs2表示反向求哈希, hs表示数组b的哈希
int n;
uLL a[N], b[N];
int main(){
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        pw[i] = pw[i - 1] * base;
    }
    for(int i = 1; i <= n; i++) scanf("%u", &a[i]);
    for(int i = 1; i <= n; i++) scanf("%u", &b[i]), hs = hs * base + b[i];
    for(int i = 1; i <= n; i++) {
        hs1[i] = hs1[i - 1] * base + a[i];
    }
    for(int i = n ;i > 0; i--){
        hs2[i] = hs2[i + 1]*base + a[i];
    }
    //for(int i = 1; i <= n; i++) printf("%u ", hs1[i]);
    //printf("\n");
    // for(int i = 1; i <= n; i++) printf("%u ", hs2[i]);
    // printf("\n");
    int ans = 0;
    for(int i = 1; i < n; i++){
        for(int j = i + 1; j <= n; j++){
            uLL sum1 = hs1[i - 1]*pw[n - i + 1];
            uLL sum2 = (hs2[i] - hs2[j + 1]*pw[j - i + 1])*pw[n -j];
            uLL sum3 = (hs1[n] - hs1[j]*pw[n - j]);
            //printf("i = %d j = %d ", i, j);
            //printf("%u %u %u, %u \n", sum1, sum2, sum3, sum1 + sum2 + sum3);
            if(sum1 + sum2 + sum3 == hs) ans++;
        }
    }
    printf("%d\n", ans);
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

监控房价和挂牌数量的工具-以成都房价为例

介绍 本文将介绍如何通过zervice提供的工具来监控成都房价&#xff08;其他城市或者地区类似&#xff09;&#xff0c;包括价格和挂牌数量。可以对购房一族提供数据参考。 数据来源 数据来源方面&#xff0c;本文以成都为例&#xff0c;我们会使用链家数据-> 选择地图找房…

《Linux系统编程篇》Visual Studio Code配置下载,中文配置,连接远程ssh ——基础篇

引言 vscode绝对值得推荐&#xff0c;非常好用&#xff0c;如果你能体会其中的奥妙的话。 工欲善其事&#xff0c;必先利其器 ——孔子 文章目录 引言下载VS Code配置VS Code中文扩展连接服务器 连接服务器测试确定服务器的IP地址VS code 配置ssh信息选择连接到主机选择这个添…

【JVM实战篇】内存调优:内存泄露危害+内存监控工具介绍+内存泄露原因介绍

文章目录 内存调优内存溢出和内存泄漏内存泄露带来什么问题内存泄露案例演示内存泄漏的常见场景场景一场景二 解决内存溢出的方法常用内存监控工具Top命令优缺点 VisualVM软件、插件优缺点监控本地Java进程监控服务器的Java进程&#xff08;生产环境不推荐使用&#xff09; Art…

微信小程序毕业设计-青少年科普教学系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

ubuntu服务器安装labelimg报错记录

文章目录 报错提示查看报错原因安装报错 报错提示 按照步骤安装完labelimg后&#xff0c;在终端输入labelImg后&#xff0c;报错&#xff1a; (labelimg) rootinteractive59753:~# labelImg ………………Got keys from plugin meta data ("xcb") QFactoryLoader::Q…

ArrayList模拟实现

ArrayList模拟实现 ArrayList 的初步介绍常见操作 ArrayList 的简单模拟实现 ArrayList 的初步介绍 ArrayList也叫做顺序表&#xff0c;底层是一个数组。 在创建顺序表 时就应该规定 里面元素的数据类型&#xff0c;其中不能直接传基本数据类型&#xff0c;例如int、char。需要…

VS编译和使用modbus库

一.libmodbus 库 免费的开源的&#xff0c;modbus 开发库&#xff0c;支持 RTU 和 TCP 官网&#xff1a;libmodbus.org 在线文档&#xff1a;https://libmodbus.org/reference/ 二.源码简介 项目说明doc 目录各 API 接口的详细说明文档src 目录源码都在这个目录下tests 目录…

06 人以群分 基于邻域的协同过滤算法

这一讲我们将正式进入算法内容的学习。 推荐算法本质 推荐算法本质上是一一种信息处理方法&#xff0c;它将用户信息和物品信息处理后&#xff0c;最终输出了推荐结果。因为 05 讲中基于热门推荐、基于内容推荐、基于关联规则推荐等方法比较粗放&#xff0c;所以推荐结果往往…

C语言 | Leetcode C语言题解之第231题2的幂

题目&#xff1a; 题解&#xff1a; const int BIG 1 << 30;bool isPowerOfTwo(int n) {return n > 0 && BIG % n 0; }

Study--Oracle-07-ASM自动存储管理(二)

一、ASM安装准备条件 1、ASM支持存储类型 本地祼设备&#xff08;本地的磁盘和分区&#xff09; 网络附加存储(NAS) 存储区域网络(SAN) 2、ASM使用本地裸设备&#xff0c;要点: 已经被挂载到操作系统上或者已经做了分区 映射裸设备为文件名 设置正确的权限&#xff08;针对g…

C++继承和多态

目录 继承 继承的意义 访问限定符、继承方式 赋值兼容规则&#xff08;切片&#xff09; 子类的默认成员函数 多继承 继承is a和组合has a 多态 什么是多态 形成多态的条件 函数重载&#xff0c;隐藏&#xff0c;重写的区别 override和final 多态原理 继承 继承的…

矩阵管理系统实现后台统一管理的解决方案

在当今数字化浪潮中&#xff0c;企业面临着前所未有的挑战与机遇。如何快速响应市场变化、提升运营效率、降低管理成本&#xff0c;成为众多企业关注的焦点。而矩阵管理系统作为一种新兴的管理工具&#xff0c;凭借其强大的后台统一管理能力&#xff0c;正成为越来越多企业的首…

【Redis】复制(Replica)

文章目录 一、复制是什么&#xff1f;二、 基本命令三、 配置&#xff08;分为配置文件和命令配置&#xff09;3.1 配置文件3.2 命令配置3.3 嵌套连接3.4 关闭从属关系 四、 复制原理五、 缺点 以下是本篇文章正文内容 一、复制是什么&#xff1f; 主从复制 master&#xff…

基于javaScript的冒泡排序

目录 一.前言 二.设计思路和原理 三.源代码展示 四. 案例运行结果 一.前言 冒泡排序简而言之&#xff0c;就是一种算法&#xff0c;能够把一系列的数据按照一定的顺序进行排列显示&#xff08;从小到大或从大到小&#xff09;。例如能够将数组[5,4,3,2,1]中的元素按照从小到…

使用数字孪生实现电池管理系统 (BMS) 测试自动化

电池管理系统 (BMS) 监控和控制电动飞机和电动汽车等车辆中的电池。它需要在正常和极端条件下进行严格测试&#xff0c;以证明其质量和完整性。 使用模拟电池进行测试非常有益&#xff0c;因为可以快速、反复地安全地测试各种条件&#xff0c;而不会冒着宝贵硬件的风险。这种硬…

Hash表(C++)

本篇将会开始介绍有关于 unordered_map 和 unordered_set 的底层原理&#xff0c;其中底层实现其实就是我们的 Hash 表&#xff0c;本篇将会讲解两种 Hash 表&#xff0c;其中一种为开放定址法&#xff0c;另一种为 hash 桶&#xff0c;在unordered_map 和 unordered_set 的底层…

6、evil box one

低—>中 目标&#xff1a;获取root权限以及2个flag 主机发现 靶机 192.168.1100.40 或者使用fping -gaq 192.168.100.1/24发现主机使用ping的方式。 端口扫描 发现开放了22和80 可以使用-A参数&#xff0c;-A参数会得到更多的扫描细节 访问80端口就是一个apache的基本的…

Redis 7.x 系列【23】哨兵模式

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 工作原理2.1 监控2.2 标记下线2.3 哨兵领袖2.4 新的主节点2.5 通知更新 3. …

JMeter案例分享:通过数据验证的错误,说说CSV数据文件设置中的线程共享模式

前言 用过JMeter参数化的小伙伴&#xff0c;想必对CSV Data Set Config非常熟悉。大家平时更关注变量名称&#xff0c;是否忽略首行等参数&#xff0c;其余的一般都使用默认值。然而我最近遇到一个未按照我的预想读取数据的案例&#xff0c;原因就出在最后一个参数“线程共享模…

服务重启时容器未自动启动

1、容器重启策略 通过设置容器的重启策略&#xff0c;‌可以决定在容器退出时Docker守护进程是否重启该容器。‌常见的重启策略包括&#xff1a;‌ no&#xff1a;‌不重启容器&#xff0c;‌默认策略。‌always&#xff1a;‌无论容器是如何退出的&#xff0c;‌总是重启容器…