2023牛客暑期多校训练营8(A/H/I/J)

目录

A.Alive Fossils

 H.Insert 1, Insert 2, Insert 3, ...

I.Make It Square

J.Permutation and Primes


A.Alive Fossils

思路:一开始题意看半天没看懂,后面发现只需要输出t组输入中,都出现过的字符串即可。

代码:

void solve() {int t;cin>>t;for(int i=1;i<=t;i++){int n;cin>>n;for(int i=1;i<=n;i++){string s;cin>>s;mp[s]++;}}vector<string>ans;for(auto x:mp){if(x.second==t){ans.push_back(x.first);}}cout<<ans.size()<<endl;for(auto x:ans) cout<<x<<endl;
}

 H.Insert 1, Insert 2, Insert 3, ...

思路:根据题意我们可以发现,因为数字是按顺序1,2,3......插,所以若一段区间[l,r]满足条件,那么[l,r'](r'<=r)也必然满足条件。我们可以从后往前遍历,也就是遍历区间[i,n](i从n遍历到1)。每次遍历到a[i]时,因为插入是顺序的,所以这个a[i],一定能和a[i]+1这个值对应,把它“抵消”掉,所以若一个区间合法,那么这个区间会被“抵消”完,第i个点的贡献为最左边的没被抵消完的端点-i。

举个例子吧,拿样例一来说,它的序列为:

1 1 2 2 3 3

从后往前遍历,遍历了i=5以及i=6,此时存入了两个3,它们都不合法:

不合法的值:3 3

不合法的下标:5 6

贡献为:最左边的没被抵消完的端点-i=5-5=0

然后遍历到i=4,此时a[i]=2,他能与一个a[i]+1抵消,也就是把3给抵消了,此时:

不合法的值:2 3

不合法的下标:4 6

贡献为:最左边的没被抵消完的端点-i=4-4=0

然后遍历到i=3,此时a[i]还是2,他还是能把3抵消,此时:

不合法的值:2 2

不合法的下标:3 4

贡献为:最左边的没被抵消完的端点-i=3-3=0

然后遍历到i=2,此时a[i]是1,他能把一个2抵消,此时:

不合法的值:2 (1不放入不合法的值中,因为单个1合法)

不合法的下标:4

贡献为:最左边的没被抵消完的端点-i=4-2=2

然后遍历到i=1,此时a[i]还是1,他能把一个2抵消,此时:

不合法的值: 无(1不放入不合法的值中,因为单个1合法)

不合法的下标:无

此时后面都合法了,贡献为i~n整个区间也就是6

总贡献为 :0+0+0+2+6=8

代码:

vector<int>ans,pos[maxn];
//ans存最入不满足条件的点
//pos[x]存入a[i]=x的位置
int a[maxn],st[maxn];
void solve() {int n,res=0;cin>>n;ans.push_back(n+1);//放入初始值,使得:若点i后面没有不满足条件的点,则答案加n-i+1,也就是i~n区间的贡献。for(int i=1; i<=n; i++)cin>>a[i];for(int i=n; i>=1; i--) {if(pos[a[i]+1].size()) {st[pos[a[i]+1].back()]=true;//这个点被上一个点"抵消"了,标记这个点已经合法了pos[a[i]+1].pop_back();//消掉}if(a[i]>1) {pos[a[i]].push_back(i);//存入值对应的下标ans.push_back(i);//存入不合法的位置}while(st[ans.back()])ans.pop_back();//把合法的都弹出res+=ans.back()-i;}cout<<res<<endl;
}

I.Make It Square

思路:若字符串s的长度小于t,我们将两个字符串翻转后交换,仍可以使得字符串s大于t,所以我们考虑s长度大于t的情况。

通过手玩样例我们可以发现,随着字符串p和q长度的增加,对于字符串s,分割点是固定的,分割点在后缀大小为(s.size()-t.size())/2。举个例子,比如样例三:

s=abbabbababbab,t=bab。

当p.size()=q.size()=1时:

 p+s+q+t=?abbabbababbab?bab

分割为 ?abbabbab  abbab?bab

当p.size()=q.size()=2时:

 p+s+q+t=??abbabbababbab??bab

分割为 ??abbabbab  abbab??bab

以??abbabbab  abbab??bab举例,

首先,若bab与abbabbab的后缀不重合,那么这两个部分的字符串怎么都不会相等。然后可以看出,我们可以通过字符串abbabbab作为后缀,字符串abbab作为前缀,来求出已经不固定的字符个数。

若这两个部分有重合,则判断重合部分是否一样,也就是abbabbab的重合前缀和abbab重合后缀是否一样,利用z函数判断即可,若重合部分一样则答案为1,反之答案为0。

若这两个部分没重合,则计算不固定字符的个数,答案为26的幂次。

具体实现见代码:

代码:

vector<int> zFunction(string s) {int n = s.size();vector<int> z(n + 1);z[0] = n;for (int i = 1, j = 1; i < n; i++) {z[i] = max(0ll, min(j + z[j] - i, z[i - j]));while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {z[i]++;}if (i + z[i] > j + z[j]) {j = i;}}return z;
}
void solve() {k26[0]=1;for(int i=1; i<maxn; i++) {k26[i]=k26[i-1]*26%mod;}//预处理26的幂次string s,t;int n;cin>>n>>s>>t;int lens=s.size(),lent=t.size();if((lens+lent)%2) {//若字符串长度之和为奇数,那么它们怎么都不能分割成两个相等字符串for(int i=1; i<=n; i++)cout<<0<<" ";return;}if(lens<lent) {reverse(s.begin(),s.end());reverse(t.begin(),t.end());swap(s,t);swap(lens,lent);}if(s.substr((lens+lent)/2-lent,lent)!=t) {//判断字符串t作为后缀是否合法for(int i=1; i<=n; i++)cout<<0<<" ";return;}auto v=zFunction(s);reverse(v.begin(),v.end());//v[i]表示长度为i的后缀与前缀的最大公共前缀FOR(1,n) {int now=(lens+lent+2*i)/2;//当前一半的总字符串长度int p=abs(lens-now);if(lens>now) {//若有重合部分if(v[p]!=p) cout<<0<<" ";//重合部分是否全部相同else cout<<1<<" ";//答案为加1} else {cout<<k26[p]<<" ";//答案为26^(不确定字符的个数)}}
}

J.Permutation and Primes

思路:我们可以先构造长度为7的循环节:

i+3,i+6,i+1,i+4,i+7,i+2,i+5

那么若n%7不为0的时候怎么办呢?我们可以先把前面的长度为7循环节给赋值,然后最后7+n%7个数,我们随便找一组解满足它与循环节的末尾形成奇质数,放预处理后面即可。

代码:

int cmp[7][15] {{3,6,1,4,7,2,5},//长度为7的循环节{5,2,7,4,1,8,3,6},//最后8个数,此时n%7=1{9,6,3,8,5,2,7,4,1},//最后9个数,此时n%7=2{9,4,7,2,5,10,3,8,1,6},//最后10个数,此时n%7=3{11,8,5,10,7,2,9,4,1,6,3},//最后11个数,此时n%7=4{1,6,3,10,7,12,5,2,9,4,11,8},//最后12个数,此时n%7=5{1,4,9,2,7,12,5,10,3,6,13,8,11}//最后13个数,此时n%7=6
};
void solve() {cin>>n;int k=n/7;if(n==2) {cout<<"1 2"<<endl;} else if(n==3) {cout<<"1 2 3"<<endl;} else if(n==4) {cout<<"1 2 3 4"<<endl;} else if(n==5) {cout<<"1 4 3 2 5"<<endl;} else if(n==6) {cout<<"4 3 6 5 2 1"<<endl;}if(n<=6)return;for(int i=0; i<k-1; i++) {for(int j=0; j<7; j++) {a[i*7+j+1]=i*7+cmp[0][j];}}//前面的循环节赋值 for(int i=0; i<7+n%7; i++) {a[(k-1)*7+i+1]=(k-1)*7+cmp[n%7][i];}//最后放合法解 for(int i=1; i<=n; i++)cout<<a[i]<<" \n"[i==n];
}

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

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

相关文章

实验三 图像分割与描述

一、实验目的&#xff1a; &#xff08;1&#xff09;进一步掌握图像处理工具Matlab&#xff0c;熟悉基于Matlab的图像处理函数。 &#xff08;2&#xff09;掌握图像分割方法&#xff0c;熟悉常用图像描述方法。 二、实验原理 1.肤色检测 肤色是人类皮肤重要特征之一&#xff…

7.原 型

7.1原型 【例如】 另外- this指向&#xff1a; 构造函数和原型对象中的this都指向实例化的对象 7.2 constructor属性 每个原型对象里面都有个constructor属性( constructor构造函数) 作用&#xff1a;该属性指向该原型对象的构造函数 使用场景: 如果有多个对象的方法&#…

Springboot 实践(4)swagger-ui 测试controller

前文项目操作&#xff0c;完成了项目的创建、数据源的配置以及数据库DAO程序的生成与配置。此文讲解利用swagger-ui界面&#xff0c;测试生成的数据库DAO程序。目前&#xff0c;项目swagger-ui界面如下&#xff1a; 以”用户管理”为例&#xff0c;简单讲述swagger-ui测试数据库…

无涯教程-Perl - s函数

描述 这不是功能。这是正则表达式替换运算符。根据PATTERN中指定的正则表达式,将数据替换为REPLACE。与m //一样,分隔符由s后的第一个字符定义。 语法 以下是此函数的简单语法- s/PATTERN/REPLACE/返回值 如果失败,此函数返回0,如果成功,则返回替换次数。 例 以下是显示…

笔记:移植xenomai到nuc972

xenomai是一个实时操作系统,想要使用它,先要移植I-pipe补丁 补丁在xenomai / ipipe-arm GitLab 我的内核是4.4-248的,合并上去会有几个小错误,随便改改就好 编译内核没有报错之后,接下来需要修改arch/arm/mach-nuc970/time.c 修改方法参考补丁里面其它设备的定时器驱动,就…

学习Vue:数据绑定的基本概念

在 Vue.js 中&#xff0c;Vue 实例是您构建应用程序的核心。它允许您将数据和界面连接起来&#xff0c;实现动态的数据绑定&#xff0c;使您的应用程序能够根据数据的变化自动更新界面。让我们来深入了解 Vue 实例与数据绑定的基本概念。 Vue 实例与数据绑定 什么是 Vue 实例&…

OPC【2】——Relationships

引言 Relationships由一系列Relationship构成。将Abstract Package看做是一个图数据结构&#xff0c;则Relationships是图数据中的边集合。 Package Relationships 对于Package Relationships&#xff0c;其所有引用关系的source对象为Abstract Package&#xff0c;或者看…

【Python机器学习】实验10 支持向量机

文章目录 支持向量机实例1 线性可分的支持向量机1.1 数据读取1.2 准备训练数据1.3 实例化线性支持向量机1.4 可视化分析 实例2 核支持向量机2.1 读取数据集2.2 定义高斯核函数2.3 创建非线性的支持向量机2.4 可视化样本类别 实例3 如何选择最优的C和gamma3.1 读取数据3.2 利用数…

Open3D 最小二乘拟合平面(SVD分解法)

目录 一、算法原理二、代码实现三、结果展示1、点云2、拟合结果四、优秀博客本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 本文实现矩阵奇异值分解方法的最小二乘拟合平面。原理如下: 对于得到的 n n

欧拉函数(质因子分解)

思路&#xff1a; (1)欧拉函数&#xff1a;输入n则输出1~n中与n互质的数的个数。 &#xff08;2&#xff09;计算公式&#xff1a; &#xff08;3&#xff09;证明&#xff1a;&#xff08;容斥原理&#xff09;对于n个数&#xff0c;先分别摘除所有被pi整除的数&#xff0c;…

亿信ABI有什么不同,来看最新DEMO演示

为了给用户营造更好的体验环境&#xff0c;提供更丰富、更完善的服务&#xff0c;亿信华辰旗下核心产品亿信ABI DEMO再次上新啦&#xff01;本次亿信ABI DEMO环境在原有基础上焕新升级&#xff0c;带来了全新的主视觉界面、丰富的行业应用和功能演示DEMO&#xff0c;我们一起来…

季度到季度的组件选择

组件&#xff1a;<template><div class"quarter"><div class"input-wrap" id"closeId" mouseover"handler" click.stop"btn" :style"{color:colorItem}"><i class"el-icon-date"&…

【Java】BF算法(串模式匹配算法)

☀️ 什么是BF算法 BF算法&#xff0c;即暴力算法&#xff0c;是普通的模式匹配算法&#xff0c;BF算法的思想就是将目标串S的第一个与模式串T的第一个字符串进行匹配&#xff0c;若相等&#xff0c;则继续比较S的第二个字符和T的第二个字符&#xff1b;若不相等&#xff0c;则…

【计算机视觉|生成对抗】用深度卷积生成对抗网络进行无监督表示学习(DCGAN)

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks 链接&#xff1a;[1511.06434] Unsupervised Representation Learning with Deep Conv…

腾讯云CVM服务器竞价实例是什么?和按量计费有什么区别?

腾讯云服务器CVM计费模式分为包年包月、按量计费和竞价实例&#xff0c;什么是竞价实例&#xff1f;竞价实例和按量付费相类似&#xff0c;优势是价格更划算&#xff0c;缺点是云服务器实例有被自动释放风险&#xff0c;腾讯云服务器网来详细说下什么是竞价实例&#xff1f;以及…

NLP——操作步骤讲义与实践链接

数据集与语料 语料是NLP的生命之源&#xff0c;所有NLP问题都是从语料中学到数据分布的规律语料的分类&#xff1a;单语料&#xff0c;平行语料&#xff0c;复杂结构 语料的例子&#xff1a;Penn Treebank, Daily Dialog, WMT-1x翻译数据集&#xff0c;中文闲聊数据集&#xf…

大数据:Numpy基础应用详解

Numpy基础应用 Numpy 是一个开源的 Python 科学计算库&#xff0c;用于快速处理任意维度的数组。Numpy 支持常见的数组和矩阵操作&#xff0c;对于同样的数值计算任务&#xff0c;使用 NumPy 不仅代码要简洁的多&#xff0c;而且 NumPy 的性能远远优于原生 Python&#xff0c;…

mysql-5.5.62-win32安装与使用

1.为啥是这个版本而不是当前最新的8.0&#xff1f; 因为我要用32位。目前mysql支持win32的版本最新只到5.7.33。 首先&#xff0c;到官网MySQL :: MySQL Downloads 然后选 选一个自己喜欢的版本就好。我这里是如标题版本。下载32位的zip。然后回来解压。 完了创建系统环境变…

项目实施方案案例模板-拿来即用

《项目实施方案》实际案例模板&#xff0c;拿来即用&#xff0c;原件可获取。 项目背景 项目目标 项目范围 项目总体计划 项目组织架构 5.1. 项目职责分工 项目风险点 6.1. 项目风险分析 6.2. 项目实施关键点 项目管理规范 7.1. 项目实施约束 7.2. 项目变更冻结 7…

(三) CUDA 硬件实现

一组带有on-chip 共享内存的SIMD多处理器 GPU可以被看作一组多处理器, 每个多处理器使用单一指令&#xff0c;多数据架构(SIMD)【单指令流多数据流】 在任何给定的时钟周期内&#xff0c;多处理器的每个处理器执行同一指令&#xff0c;但操作不同的数据 每个多处理器使用以下…