2024中国大学生算法设计超级联赛(1)

🚀欢迎来到本文🚀
🍉个人简介:陈童学哦,彩笔ACMer一枚。
🏀所属专栏:杭电多校集训
本文用于记录回顾总结解题思路便于加深理解。

📢📢📢传送门

  • A - 循环位移
    • 解题思路
    • AC代码
  • B - 星星
    • 解题思路
    • AC代码
  • H - 位运算
    • 解题思路
    • AC代码

A - 循环位移

ProblemDescription

定义字符串 S = S 0 + ⋯ + S n − 1 循环位移 k 次为 S ( k ) = S k m o d n + ⋯ + S n − 1 + S 0 + ⋯ + S ( k − 1 ) m o d n 。定义 [ A ] = A ( k ) , k ∈ N . 给出 T 组串 A , B ,询问 B 有多少个子串在 [ A ] 中。 定义字符串S=S0+⋯+Sn−1循环位移k次为S(k)=Skmodn+⋯+Sn−1+S0+⋯+S(k−1)modn。 定义[A]={A(k),k∈N}. 给出T组串A,B,询问B有多少个子串在[A]中。 定义字符串S=S0++Sn1循环位移k次为S(k)=Skmodn++Sn1+S0++S(k1)modn。定义[A]=A(k),kN.给出T组串A,B,询问B有多少个子串在[A]中。
在这里插入图片描述

Input

第一行一个 T 表示输入组数。接下来每行两个字符串,表示 A 和 B ,保证 ∣ A ∣ ≤ ∣ B ∣ 。保证 ∑ ∣ B ∣ ≤ 1048576. ,并且字符串均由大写字母组成。 第一行一个T表示输入组数。 接下来每行两个字符串,表示A和B,保证∣A∣≤∣B∣。保证∑∣B∣≤1048576.,并且字符串均由大写字母组成。 第一行一个T表示输入组数。接下来每行两个字符串,表示AB,保证A∣≤∣B。保证B∣≤1048576.,并且字符串均由大写字母组成。

在这里插入图片描述

Output

输出 T 行,每行一个数表示答案。 输出T行,每行一个数表示答案。 输出T行,每行一个数表示答案。

在这里插入图片描述

解题思路

题目要我们求字符串B中有多少个子串属于字符串A的循环位移串。
一般对于这种循环位移的东西,我们都可以去倍增一下会比较好写。
在这里我们可以将字符串A倍增一倍然后去字符串B中找有多少个长度为字符串A长度的字串然后通过字符串哈希统计答案。
首先我们可以计算一下倍增后的字符串A的每个字符的的哈希值,然后再将每个区间长度为原字符串A长度的字串的哈希值标记为1,最后再类似的处理字符串B的每个字符的哈希值,然后再判断字符串B中长度为原字符串A长度的哈希值是否被标记,如果被标记那么答案就++。
还需要注意的就是在此之前我们需要预处理一个数组f用于计算哈希值,以及区间哈希值如何计算。

AC代码

#include<bits/stdc++.h>
#define look(x) cout << #x << " ==  " << x << "\n"
using namespace std;
using i64 = long long;
const int N = 5e5 + 10;
const int MOD1 = 1e9 + 7;
const int MOD2 = 998244353;
//h1代表字符串A中字符的哈希值
//h2代表字符串B中字符的哈希值
i64 h1[N],h2[N];
//预处理的数组
i64 f[N];
//字符串A中区间哈希值的计算
i64 get1(int l,int r){return h1[r] - h1[l - 1] * f[r - l + 1];
}
//字符串B中哈希值的计算
i64 get2(int l,int r){return h2[r] - h2[l - 1] * f[r - l + 1];
}
void solve(){string s1,s2;cin >> s1 >> s2;int n1 = s1.size();int n2 = s2.size();s1 = '?' + s1 + s1;s2 = '?' + s2;//计算字符串A的每个字符的哈希值for(int i = 1;i < s1.size();i ++){h1[i] = h1[i - 1] * 11 + s1[i];}map<i64,int> mp;//标记A的每个循环位移串for(int i = 1;i < s1.size();i ++){if(i + n1 - 1 < s1.size()){mp[get1(i,i + n1 - 1)] = 1;}}//计算字符串B的每个字符的哈希值for(int i = 1;i < s2.size();i ++){h2[i] = h2[i - 1] * 11 + s2[i];}i64 ans = 0;//统计答案,被标记了就是答案,加1for(int i = 1;i < s2.size();i ++){if(i + n1 - 1 < s2.size()){ans += mp[get2(i,i + n1 - 1)];}}cout << ans << "\n";
}int main(){	ios::sync_with_stdio(false);cin.tie(nullptr);f[0] = 1;//预处理的数组ffor(int i = 1;i <= N;i ++){f[i] = f[i - 1] * 11;}int t = 1;cin >> t;while(t --){solve();}return 0;
}

B - 星星

ProblemDescription

小 A 有 n 次获得星星的机会。在第 i 次机会里他有如下的 5 种选择(他必须做出恰好一种选择): 小A有n次获得星星的机会。 在第i次机会里他有如下的5种选择(他必须做出恰好一种选择): An次获得星星的机会。在第i次机会里他有如下的5种选择(他必须做出恰好一种选择):
− 跳过这一轮。 -跳过这一轮。 跳过这一轮。
− a i 的代价获得 1 颗星星。 -ai的代价获得1颗星星。 ai的代价获得1颗星星。
− b i 的代价获得 2 颗星星。 -bi的代价获得2颗星星。 bi的代价获得2颗星星。
− c i 的代价获得 3 颗星星。 -ci的代价获得3颗星星。 ci的代价获得3颗星星。
− d i 的代价获得 4 颗星星。 -di的代价获得4颗星星。 di的代价获得4颗星星。
保证 0 < a i ≤ b i ≤ c i ≤ d i ≤ 1 0 9 。 保证0<a_i≤b_i≤c_i≤d_i≤10^9。 保证0<aibicidi109
他想要获得恰好 k 颗星星,但是并不知道最小代价是多少,请你帮他计算这个最小值。 他想要获得恰好k颗星星,但是并不知道最小代价是多少,请你帮他计算这个最小值。 他想要获得恰好k颗星星,但是并不知道最小代价是多少,请你帮他计算这个最小值。

在这里插入图片描述
Input

本题有多组数据 本题有多组数据 本题有多组数据
第一行输入数据组数 T 。 第一行输入数据组数T。 第一行输入数据组数T
对于每组数据的第一行,有两个正整数表示 n , k 。接下来 n 行,输入四个数字 a i , b i , c i , d i 。 对于每组数据的第一行,有两个正整数表示n,k。接下来n行,输入四个数字a_i,b_i,c_i,d_i。 对于每组数据的第一行,有两个正整数表示n,k。接下来n行,输入四个数字ai,bi,ci,di
1 ≤ n ≤ 1000 , 0 ≤ k ≤ n × 4. 1≤n≤1000,0≤k≤n×4. 1n1000,0kn×4.
满足 ∑ n ≤ 100000 满足∑n≤100000 满足n100000

在这里插入图片描述
Output

对于每组数据,输出一个数字表示这组数据的答案。 对于每组数据,输出一个数字表示这组数据的答案。 对于每组数据,输出一个数字表示这组数据的答案。

在这里插入图片描述

解题思路

n次获得星星中恰好获得k颗星星的最小代价,是不是有点和01背包的n件物品中背包容量恰好为v的最大价值有点类似。
对的,那么这题肯定大概率应该就是个变形版的01背包了。
那么就直接考虑dp, d p [ N ] dp[N] dp[N]代表的是获得星星为 N N N时所付出的最小代价。

AC代码

#include<bits/stdc++.h>
#define look(x) cout << #x << " ==  " << x << "\n"
using namespace std;
using i64 = long long;
const int N = 2e5 + 10;
const int MOD1 = 1e9 + 7;
const int MOD2 = 998244353;
//获得1、2、3、4颗星星时所需要付出的代价
int a[1010],b[1010],c[1010],d[1010];
//获得星星数为x时所需付出的最小代价
i64 dp[4040];
void solve(){//初始化为无穷大memset(dp,0x3f,sizeof(dp));//获得0颗星星时不需要付出代价dp[0] = 0;int n,k;cin >> n >> k;for(int i = 1;i <= n;i ++){cin >> a[i] >> b[i] >> c[i] >> d[i];}//第i次获得星星的机会for(int i = 1;i <= n;i ++){//目前获得的星星数for(int j = k;j >= 0;j --){//在获得1、2、3、4颗星星时依次转移for(int t = 1;t <= 4;t ++){if(j >= t){if(t == 1){dp[j] = min(dp[j],dp[j - t] + a[i]);}else if(t == 2){dp[j] = min(dp[j],dp[j - t] + b[i]);}else if(t == 3){dp[j] = min(dp[j],dp[j - t] + c[i]);}else if(t == 4){dp[j] = min(dp[j],dp[j - t] + d[i]);}}}}}//输出恰好获得k颗星星时的最小代价cout << dp[k] << "\n";
}int main(){	ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;cin >> t;while(t --){solve();}return 0;
}

H - 位运算

ProblemDescription

小丁最近对位运算很感兴趣,通过学习,他知道了按位与 ⊗ ,按位异或 ⊕ ,以及按位或 ⊖ 三种常见位运算。 小丁最近对位运算很感兴趣,通过学习,他知道了按位与⊗,按位异或⊕,以及按位或⊖三种常见位运算。 小丁最近对位运算很感兴趣,通过学习,他知道了按位与,按位异或,以及按位或三种常见位运算。
按位与 ⊗ :二进制下每一位做与,即 0 ⊗ 0 = 0 , 0 ⊗ 1 = 0 , 1 ⊗ 0 = 0 , 1 ⊗ 1 = 1 。 按位与⊗:二进制下每一位做与,即0⊗0=0,0⊗1=0,1⊗0=0,1⊗1=1。 按位与:二进制下每一位做与,即00=0,01=0,10=0,11=1
按位异或 ⊕ :二进制下每一位做异或,即 0 ⊕ 0 = 0 , 0 ⊕ 1 = 1 , 1 ⊕ 0 = 1 , 1 ⊕ 1 = 0 。 按位异或⊕:二进制下每一位做异或,即0⊕0=0,0⊕1=1,1⊕0=1,1⊕1=0。 按位异或:二进制下每一位做异或,即00=0,01=1,10=1,11=0
按位或 ⊖ :二进制下每一位做或,即 0 ⊖ 0 = 0 , 0 ⊖ 1 = 1 , 1 ⊖ 0 = 1 , 1 ⊖ 1 = 1 。 按位或⊖:二进制下每一位做或,即0⊖0=0,0⊖1=1,1⊖0=1,1⊖1=1。 按位或:二进制下每一位做或,即00=0,01=1,10=1,11=1
现在,对于一个在 [ 0 , 2 k ) 中的整数 n ,小丁想要知道,有多少组也在 [ 0 , 2 k ) 中的整数 a , b , c , d ,满足: 现在,对于一个在[0,2^k)中的整数n,小丁想要知道,有多少组也在[0,2^k)中的整数a,b,c,d,满足: 现在,对于一个在[0,2k)中的整数n,小丁想要知道,有多少组也在[0,2k)中的整数a,b,c,d,满足:

a ⊗ b ⊕ c ⊖ d = n a⊗b⊕c⊖d=n abcd=n
注意,运算符是从左往右依次顺序结合的,即可以认为原表达式为: 注意,运算符是从左往右依次顺序结合的,即可以认为原表达式为: 注意,运算符是从左往右依次顺序结合的,即可以认为原表达式为:
( ( ( a ⊗ b ) ⊕ c ) ⊖ d ) = n (((a⊗b)⊕c)⊖d)=n (((ab)c)d)=n

在这里插入图片描述
Input

本题单个测试点内包含多组测试数据。 本题单个测试点内包含多组测试数据。 本题单个测试点内包含多组测试数据。
第一行一个整数 T ( 1 ≤ T ≤ 10 ) ,表示数据组数。 第一行一个整数T(1≤T≤10),表示数据组数。 第一行一个整数T(1T10),表示数据组数。
对于每组数据,一行两个整数 n , k ( 1 ≤ k ≤ 15 , 0 ≤ n < 2 k ) 。 对于每组数据,一行两个整数n,k(1≤k≤15,0≤n<2^k)。 对于每组数据,一行两个整数n,k(1k15,0n<2k)

在这里插入图片描述

Output

对于每组数据输出 q 行,每行一个整数表示答案。 对于每组数据输出q行,每行一个整数表示答案。 对于每组数据输出q行,每行一个整数表示答案。

在这里插入图片描述

解题思路

对于这种位运算的题,绝大部分情况下直接枚举十进制下的数肯定会TLE的,一般都是找二进制下每位的规律。
要使得 ( ( ( a ⊗ b ) ⊕ c ) ⊖ d ) = n (((a⊗b)⊕c)⊖d)=n (((ab)c)d)=n,那么 a 、 b 、 c 、 d a、b、c、d abcd二进制的这位数字要么为1要么为0,如果它们当前位通过 ⊗ 、 ⊕ 、 ⊖ ⊗、⊕、⊖ 运算后的结果1,那么n的二进制下的当前位也应该位1,反之则为0。
那么我们便可以通过预处理 a 、 b 、 c 、 d a、b、c、d abcd四个数取1或0的所有情况,然后通过判断n的二进制下每位是1还是0累加答案即可。
或者我们可以通过分类讨论。
一、n的当前位在二进制下位1时
  1、当d的当前位为1时, ( ( a ⊗ b ) ⊕ c ) ((a⊗b)⊕c) ((ab)c)中的a、b、c无论如何取值都不会影响结果,所有共有 2 3 2^3 23即8。
  2、当d的当前位为0时,再分类讨论下 ( ( a ⊗ b ) ⊕ c ) ((a⊗b)⊕c) ((ab)c)为1还是0。
    ①、当c为1时, ( a ⊗ b ) (a⊗b) (ab)共有3种情况使得 ( ( ( a ⊗ b ) ⊕ c ) ⊖ d ) (((a⊗b)⊕c)⊖d) (((ab)c)d)为1
    ②、当c为0时, ( a ⊗ b ) (a⊗b) (ab)共有1种情况使得 ( ( ( a ⊗ b ) ⊕ c ) ⊖ d ) (((a⊗b)⊕c)⊖d) (((ab)c)d)为1
综上所述共有12种情况使得进制位为1。

二、n的当前位在二进制下位0时
  1、当d的当前位为1时, ( ( a ⊗ b ) ⊕ c ) ((a⊗b)⊕c) ((ab)c)中的a、b、c无论如何取值无法使得 ( ( a ⊗ b ) ⊕ c ) ((a⊗b)⊕c) ((ab)c)满足条件,即0种情况。
  2、当d的当前位为0时,再分类讨论下 ( ( a ⊗ b ) ⊕ c ) ((a⊗b)⊕c) ((ab)c)为1还是0。
    ①、当c为1时, ( a ⊗ b ) (a⊗b) (ab)共有1种情况使得 ( ( ( a ⊗ b ) ⊕ c ) ⊖ d ) (((a⊗b)⊕c)⊖d) (((ab)c)d)为0
    ②、当c为0时, ( a ⊗ b ) (a⊗b) (ab)共有3种情况使得 ( ( ( a ⊗ b ) ⊕ c ) ⊖ d ) (((a⊗b)⊕c)⊖d) (((ab)c)d)为0
综上所述共有12种情况使得进制位为4。

最后总结也就能看出来如果n二进制下的当前位为1的话就 ∗ 12 *12 12,否则 ∗ 4 *4 4

AC代码

#include<bits/stdc++.h>
#define look(x) cout << #x << " ==  " << x << "\n"
using namespace std;
using i64 = long long;
const int N = 2e5 + 10;
const int MOD1 = 1e9 + 7;
const int MOD2 = 998244353;
void solve(){int n,k;cin >> n >> k;i64 ans = 1;for(int i = 0;i < k;i ++){if((n >> i) & 1){ans *= 12;}else{ans *= 4;}}cout << ans << "\n";
}int main(){	ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;cin >> t;while(t --){solve();}return 0;
}

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

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

相关文章

linux 网络子系统

__netif_receive_skb_core 是 Linux 内核网络子系统中一个非常重要的函数&#xff0c;它负责将网络设备驱动层接收到的数据包传递到上层协议栈进行处理。以下是对该函数的一些关键点的详细解析&#xff1a; 一、函数作用 __netif_receive_skb_core 函数是处理接收到的网络数据…

【简历】贵州某二本学院:JAVA秋招简历指导,简历通过率基本为0

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份某师范学院25届二本同学的Java简历。这种就是每年都会出现的少量的完全不知道简历应该怎么写的同学。 所以这个简历&#xff0…

Java实现七大排序(一)

目录 一.插入排序 1.直接插入排序 2.希尔排序 二.选择排序 1.选择排序 2.堆排序 三.总结 一.插入排序 1.直接插入排序 直接插入排序的原理与线下玩扑克牌类似。我们拿到一张牌后要排序&#xff0c;方法就是一张一张对。直接插入排序也是这样的&#xff0c;我们得到一张…

虚拟机迁移报错:虚拟机版本与主机“x.x.x.x”的版本不兼容

1.虚拟机在VCenter上从一个ESXi迁移到另一个ESXi上时报错&#xff1a;虚拟机版本与主机“x.x.x.x”的版本不兼容。 2.例如从10.0.128.13的ESXi上迁移到10.0.128.11的ESXi上。点击10.0.128.10上的任意一台虚拟机&#xff0c;查看虚拟机版本。 3.确认要迁移的虚拟机磁盘所在位…

Vue--解决error:0308010C:digital envelope routines::unsupported

原文网址&#xff1a;Vue--解决error:0308010C:digital envelope routines::unsupported_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决node.js在运行Vue项目时的报错&#xff1a;error:0308010C:digital envelope routines::unsupported。 问题描述 使用node.js运行Vu…

力扣3226 使两个整数相等的位更改次数

写的代码&#xff1a; class Solution { public:string cc(int num){string res"";while(num>0){int rnum % 2;resstatic_cast<char>(48r)res;num/2;}return res;}int minChanges(int n, int k) {int res0;string n2cc(n);string k2cc(k);int n_sizen2.siz…

机器人开源调度系统OpenTCS-6最新版本地源码运行

OpenTCS 项目使用 Gradle 而不是 Maven&#xff0c;那么需要使用 Gradle 来导入和构建项目。在 IntelliJ IDEA 中导入和运行使用 Gradle 的项目&#xff0c;可以按照以下步骤进行操作&#xff1a; 克隆 OpenTCS 源码 首先&#xff0c;克隆 OpenTCS 的源码到本地。您可以使用以…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十八章 驱动模块编译进内核

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

cf场+线性dp

Problem - B - Codeforces 思路&#xff1a; 这其实是一道数学题&#xff08;最开始一直在枚举&#xff0c;服啦&#xff09; 我们的目的是求最大利润 当a>b是时直接令k0,利润n*a即可 当a<b时存在两种情况&#xff1a; 1.b-a>n即所有b-i1的情况都>a&#xff0…

掌握Python:三本不可错过的经典书籍

强烈推荐Python初学者用这三本书入门! Python3剑客 一、《Python编程从入门到实践》 这本书适合零基础的Python读者&#xff0c;旨在帮助他们快速入门Python编程&#xff0c;并达到初级开发者的水平。书中深入浅出地介绍了Python的基础概念&#xff0c;如变量、循环、函数等…

【BUG】已解决:ModuleNotFoundError: No module named ‘tensorboard‘

ModuleNotFoundError: No module named ‘tensorboard‘ 目录 ModuleNotFoundError: No module named ‘tensorboard‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#…

爬虫学习4:爬取王者荣耀技能信息

爬虫&#xff1a;爬取王者荣耀技能信息&#xff08;代码和代码流程&#xff09; 代码 # 王者荣耀英雄信息获取 import time from selenium import webdriver from selenium.webdriver.common.by import By if __name__ __main__:fp open("./honorKing.txt", "…

主机加固,如何重塑产线工控安全的防勒索病毒生态

在数字化转型的浪潮中&#xff0c;企业信息安全面临着前所未有的挑战&#xff0c;尤其是针对主机层面的攻击手段愈发狡猾。MCK主机加固系统&#xff0c;作为新一代主机安全防护方案&#xff0c;凭借其独步业界的内核级签名校验技术和深度学习驱动的业务场景白名单策略&#xff…

Cookie Session Token

Cookie (小型文本文件) 存储位置&#xff1a; 客户端&#xff08;浏览器&#xff09;中的 Cookie。 工作原理&#xff1a; 登录&#xff1a;用户提交登录表单&#xff0c;服务器验证凭证&#xff08;如用户名和密码&#xff09;。 设置 Cookie&#xff1a;服务器在响应中设置…

Win10环境将Docker部署到非系统盘

Win10环境将Docker部署到非系统盘 目录 Win10环境将Docker部署到非系统盘 一、Docker官网客户端Docker Hub下载 二、windows环境的安装 三、正确的迁移步骤 3.1、确保你的系统分区至少3G的剩余空间&#xff1b; 3.2、默认方式安装Docker hub&#xff1b; 3.3、打开Dock…

切换IP地址如何实现?

随着互联网的发展和普及&#xff0c;我们日常生活中的各种操作和通讯越来越依赖互联网。互联网上存在的一些问题和限制使得更换IP地址成为必要的步骤。下面我们将探讨在互联网业务中&#xff0c;需要更换IP地址的原因与方法。 一、IP轮换的应用 解决访问限制&#xff1a;解决访…

Java语言程序设计——篇五(1)

数组 概述数组定义实例展示实战演练 二维数组定义数组元素的使用数组初始化器实战演练&#xff1a;矩阵计算 &#x1f4ab;不规则二维数组实战演练&#xff1a;杨辉三角形 概述 ⚡️数组是相同数据类型的元素集合。各元素是有先后顺序的&#xff0c;它们在内存中按照这个先后顺…

分类预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测

分类预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积支持向量机分类预测&#xff0…

[排序]hoare快速排序

今天我们继续来讲排序部分&#xff0c;顾名思义&#xff0c;快速排序是一种特别高效的排序方法&#xff0c;在C语言中qsort函数&#xff0c;底层便是用快排所实现的&#xff0c;快排适用于各个项目中&#xff0c;特别的实用&#xff0c;下面我们就由浅入深的全面刨析快速排序。…