寒假思维训练day17 C. Equal Frequencies

不知不觉已经过了差不多一个月了,坚持一件事情还是有点收获的,今天更新一道1600的构造。


寒假训练计划day17


摘要:

Part1 题意

Part2 题解 (有数学推导,latex形式)

Part3 代码 (C++版本,有详细注释)

Part4 我对构造题的归纳总结(自己对构造题的浅薄理解还有例题

题目链接(有需自取):Problem - 1781C - Codeforces


Part1 题意

题意:

规定字符串是平衡字符串当且仅当字符串中每个字符的数量相等,给定一个长度为n的字符串S,要求找到一个长度为n, n \leq 1e5的平衡字符串T,使得满足T和S的字符匹配数最多,也就是\sum_{i = 0}^{n - 1} (S[i] == T[i] ? 1 : 0)最大,输出不匹配的数量和构造出来的T。


Part2 题解

题解:

1、已知n,S, 设res为字符串的匹配数量并赋初值0。 

2、我们来观察一下平衡字符串有什么性质,因为在平衡字符串中,每个字符的数量都是相等的,假设我们知道每个字符的数量都是cnt,显然n \% cnt = 0, 1 \leq n / cnt \leq 26, 这两个数本质就是n的约数。所以我们对n分解约数,找到所有满足cnt * hve = n, cnt <= 26的数对。

3、假设我们当前考虑cnt, hve,我们需要求出当前这样分配最多能匹配几个字符,因为每个字符在原字符串中的数量不同,所以我们预处理一个Pair<int, char>序列,他们存的是S中的字符和字符的数量,并且排序,再处理出来一个该序列的前缀和序列,根据这两个序列我们可以开始求最多能匹配几个字符,我们先二分出大于等于hve的位置,再进行分了讨论,具体如下:

// u1是cnt, u2是hve, v是匹配数量     
int u1 = c, u2 = n / c;
int l = 1, r = cnt, v; 
if(u1 <= 26) {// 先二分while(l < r) {int mid = l + r >> 1;if(q[mid].ff >= u2) r = mid;else l = mid + 1;}// 分类讨论v = -1e18;if(q[l].ff >= u2) {if(cnt - l + 1 >= u1) v = u1 * u2;else v = (cnt - l + 1) * u2 + qs[l - 1] - qs[max(0ll,l - 1 - (u1 - (cnt - l + 1)))];}else {v = qs[cnt] - qs[max(0ll,cnt - u1)];}// 更新res if(res < v) {res = v;usu1 = u1, usu2 = u2;}
}

最后得到了使得匹配数量res最大的cnt, hve

4、现在我们需要利用cnt,hve逆向构造出T,首先我们对于已经处理出来的Pair<int, char>序列(已排序)的后面cnt个,注意可以会有不足的情况,我们就得补充回去,具体操作如下:

cout << n - res << endl;  // 输出最后不匹配的最小数量
vector<char> us;   
// 先处理在原字符串中的字符 
for(int i = cnt; i >= max(1ll, cnt - usu1 + 1); i--) {    us.push_back(q[i].ss); st[q[i].ss - 'a'] = usu2;      
}// 先将原字符串的字符有st标记的填入
for(int i = 0; i < n; i++) if(st[s[i] - 'a']) { ans[i] = s[i];st[s[i] - 'a']--;is_use[i] = 1;}// 将后面的补上
for(int i = max(1ll, cnt - usu1 + 1) - 1; i >= 1; i--)us.push_back(q[i].ss), st[q[i].ss - 'a'] = usu2;  // 如果不够再补上一些没用过的字符
for(int i = 0; i <= 25; i++) if(!ot[i]) us.push_back(i + 'a'), st[i] = usu2;  int l = 0;
// 最后从入序列的顺序补全字符串
for(int i = 0; i < n; i++) { while(!st[us[l] - 'a']) l++; if(!is_use[i]) ans[i] = us[l], st[us[l] - 'a']--;
}for(int i = 0; i < n; i++) cout << ans[i];
cout << endl;

Part3 代码(C++):

#include <bits/stdc++.h>
#define int long long 
#define ff first 
#define ss second 
using namespace std;
using PII = pair<int, char>; 
constexpr int N = 1e6 + 10; 
int n, m, sum; 
int ot[50], qs[50], is_use[N], st[50], cnt; 
PII q[50];
void solve() {string s; cin >> n >> s; cnt = 0;for(int i = 0; i <= 30; i ++ ) ot[i] = 0, st[i] = 0; for(int i = 0; i < n; i ++ ) ot[s[i] - 'a'] ++, is_use[i] = 0;for(int i = 0; i <= 30; i ++ ) if(ot[i]) q[++ cnt] = {ot[i], 'a' + i};sort(q + 1, q + 1 + cnt);for(int i = 1; i <= cnt; i ++ ) qs[i] = q[i].ff + qs[i - 1];int res = -1e18;vector<char> ans(n + 1, 0); int usu1,usu2;for(int c = 1; c <= n / c; c ++ ) if(n % c == 0) {int u1 = c, u2 = n / c;int l = 1, r = cnt, v; if(u1 <= 26) {while(l < r) {int mid = l + r >> 1;if(q[mid].ff >= u2) r = mid;else l = mid + 1;}v = -1e18;if(q[l].ff >= u2) {if(cnt - l + 1 >= u1) v = u1 * u2;else v = (cnt - l + 1) * u2 + qs[l - 1] - qs[max(0ll,l - 1 - (u1 - (cnt - l + 1)))];}else {v = qs[cnt] - qs[max(0ll,cnt - u1)];}if(res < v) {res = v;usu1 = u1, usu2 = u2;}}u1 = n / c, u2 = c;if(u1 <= 26) {l = 1, r = cnt;while(l < r) {int mid = l + r >> 1;if(q[mid].ff >= u2) r = mid;else l = mid + 1;}v = -1e18;if(q[l].ff >= u2) {if(cnt - l + 1 >= u1) v = u1 * u2;else v = (cnt - l + 1) * u2 + qs[l - 1] - qs[max(0ll,l - 1 - (u1 - (cnt - l + 1)))];}else {v = qs[cnt] - qs[max(0ll,cnt - u1)];}if(res < v) {res = v;usu1 = u1, usu2 = u2;}}}cout << n - res << endl; vector<char> us;for(int i = cnt; i >= max(1ll, cnt - usu1 + 1); i -- ) {us.push_back(q[i].ss), st[q[i].ss - 'a'] = usu2;  // cout << q[i].ss << endl;}for(int i = 0; i < n; i ++ ) if(st[s[i] - 'a']) { // cout << s[i] << endl;ans[i] = s[i], st[s[i] - 'a'] --, is_use[i] = 1;// cout << ans[i] <<  "#";}for(int i = max(1ll, cnt - usu1 + 1) - 1; i >= 1; i -- )us.push_back(q[i].ss), st[q[i].ss - 'a'] = usu2;  for(int i = 0; i <= 25; i ++ ) if(!ot[i]) us.push_back(i + 'a'), st[i] = usu2;  int l = 0;for(int i = 0; i < n; i ++ ) { while(!st[us[l] - 'a']) l ++; if(!is_use[i]) ans[i] = us[l], st[us[l] - 'a'] --;}for(int i = 0; i < n; i ++ ) cout << ans[i];cout << endl;
}   
signed main() {int ts; cin >> ts; while(ts --) solve(); return 0; 
}


Part4 我对构造题的归纳总结(自己对构造题的浅薄理解) 

1、前后缀贪心,比如说观察前后缀的sum,去看以后怎么考虑最好。Problem - 1903C - Codeforces

2、双指针贪心法,考虑两端相消或者相互作用,还有就是考虑左右边界。   Problem - 1891C - Codeforces

Problem - 1907D - Codeforces

3、转换观察法,有些关系可以抽象成图,观察图的某些性质去总结规律。也可以抽象成一个集合,两个集合相等可以说明有解可构造。Problem - 1891C - Codeforces

4、打表找规律,一般没什么规律可循即可打表找规律,一般和数论有关的很喜欢考,acm也喜欢考,属于人类智慧题。Problem - 1916D - Codeforces

5、公式推导演算,常见的分为公式的等价变形、公式的化简(这个常考,一般需要先证明某些性质,可以直接抵消,一般如果原公式处理起来很复杂时就可以考虑)。Problem - 1889B - Codeforces

6、考虑奇偶数去简化问题或者分类问题,从其中的一些运算性质入手,因为奇数偶数的加减以及%运算(这个结论很重要)的结果的奇偶性是固定的,Problem - 1898C - Codeforces

7、根据性质构造模型,看看能不能分成几个块,几个不同的集合,再选择算法去解决。Problem - 1873G - Codeforces

8、考虑从小到大处理,或者是从大到小处理,有时候先处理小的对大的不会有影响,或者反过来,这样的处理顺序是最完美的。Problem - 1904D2 - Codeforces

9、边界贪心法,一般要在问题的最边界处考虑,有时候这样做结果是最优的,或者考虑边界上的影响,假如让影响最小,就使得影响<= 固定值 。 ​​​​​​Problem - E - Codeforces and Problem - 1903C - Codeforces

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

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

相关文章

基于YOLOv7算法的高精度实时安全帽和背心目标检测系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时安全帽和背心目标检测系统可用于日常生活中检测与定位安全帽和安全背心&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标…

【电子科技大学】计算机高级图形学总复习

第一章&#xff1a;绪论 图形学和图像学 走样的原因和反走样 走样指的是&#xff1a;用离散量表示连续量引起的失真 反走样&#xff1a;为了提高图形的显示质量&#xff0c;需要减少或消除因走样带来的阶梯形或闪烁的效果&#xff0c;用于减少或消除这种效果的方法称为反走样…

【51单片机Keil+Proteus8.9】门锁控制电路

门锁控制电路 二、设计思路 电路设计 1.电源部分&#xff1a;使用BATTERY为整个电路提供电源&#xff0c;可以在电路中加入一个电 源开关&#xff0c;以便控制电源的开启和关闭。 2.处理器部分&#xff1a;使用AT89C51芯片作为主处理器&#xff0c;通过编写程序实现门锁的 …

《Lua程序设计》-- 学习9

迭代器和泛型for 迭代器和闭包 迭代器&#xff08;iterator&#xff09;是一种可以让我们遍历一个集合中所有元素的代码结构。在Lua语言中&#xff0c;通常使用函数表示迭代器&#xff1a;每一次调用函数时&#xff0c;函数会返回集合中的“下一个”元素。 一个闭包就是一个…

SD-WAN有哪些组网方式?

随着企业网络需求的不断增长和变化&#xff0c;SD-WAN作为一种先进的网络架构技术&#xff0c;提供了多种灵活的组网方式&#xff0c;以适应不同企业的需求。本文将介绍SD-WAN常见的几种组网方式&#xff0c;帮助企业更好地理解如何利用SD-WAN构建高效的网络。 1、点对点&#…

离线使用Element UI和Vue

需要依赖如下&#xff1a; 1.vue.js; 2.index.js(Element UI) 3.index.css(Element UI) 4.element-icons.ttf(Element UI字体) 5.element-icons.woff(Element UI图标) 下载链接如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1nGOi0Vm_xExRGmVp6oVLoA 提取…

【笔记】React-Native跟Android交互--简单示例

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程&#xff1a;https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

【读点论文】SPTS Single-Point Text Spotting

SPTS Single-Point Text Spotting ABSTRACT 现有的场景文本识别(即&#xff0c;端到端文本检测和识别)方法依赖于昂贵的边界框注释(例如&#xff0c;文本行&#xff0c;词级或字符级边界框)。我们首次证明&#xff0c;训练场景文本识别模型可以通过对每个实例的单点进行极低成…

线性代数----------学习记录

线性代数发展历程 &#xff08;1&#xff09;线性方程组&#xff1a;例如二元一次方程组&#xff1b; &#xff08;2&#xff09;行列式&#xff1a;determinant,克莱默&#xff0c;莱布尼兹&#xff1b; &#xff08;3&#xff09;矩阵&#xff1a;方程个数与未知数的个数可…

黑马程序员前端web入门:新浪新闻

黑马程序员前端web入门&#xff1a;新浪新闻 几点学习到的&#xff1a; 设置li无圆点: list-style: none;设置a无下划线&#xff1a;text-decoration: none;a属于行内元素&#xff0c;高度hegiht不起作用&#xff0c;可以设置 display: block; 把它变成块元素。此时&#xff0c…

万户 ezOFFICE wpsservlet SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

操作系统-调度算法-1(先来先服务算法 短作业优先 高响应比优先 )

文章目录 总览先来先服务算法例题 短作业优先例题&#xff08;非抢占式的短作业优先调度算法&#xff09;例题&#xff08;抢占式的短作业优先调度算法&#xff09;注意 FCFS和SJF两种算法的思考高响应比优先例题 小结 总览 先来先服务算法 不会导致饥饿&#xff1a;只要该进程…

拥抱变局,坚韧向新|复旦大学-华盛顿大学EMBA项目C20毕业典礼

12月初&#xff0c;复旦大学-华盛顿大学EMBA项目20班的学员们前往美国&#xff0c;完成了项目最后一次移动课堂&#xff0c;并在奥林商学院举办了毕业典礼。      20班的学员们在项目20周年之际入学&#xff0c;也是疫情以来第一个正式恢复线下授课的班级。虽然经历了一些波…

C语言基础13

今天是学习嵌入式相关内容的第十四天&#xff0c;以下是今日所学内容 1.结构体: 1.结构体类型定义 2.结构体变量的定义 3.结构体元素的访问 4.结构体的存储 内存对齐 结构体整体的大小必须为最大基本类型长度的整数倍 5.结构体作为函数参数 值传递 练习:定…

【pdf密码】怎么打印加密的PDF文件?

PDF文件是可以打开查看的&#xff0c;但是现在不能编辑、不能打印&#xff0c;功能栏中的功能都是灰色的&#xff0c;这种设置了加密的PDF文件该如何加密&#xff1f; 如果PDF中的大多数功能按钮以及打印按钮都是灰色的状态&#xff0c;那就证明是文件的问题导致不能打印的。 …

sqlmap的使用

2024.1.31 sqlmap支持五种不同的注入模式&#xff1a; 1、布尔盲注2、时间盲注3、报错注入4、联合注入5、堆叠注入 检测注入 GET请求的基本格式 ​python sqlmap.py -u <测试网址> Ps:不知道为什么我的sqlmap使用时前面要加python&#xff0c;而大部分其他教程没提到…

React、React Router、JSX 简单入门快速上手

React、React Router、JSX 简单入门快速上手 介绍特点 JSX使用js表达式渲染列表样式控制注意事项 入门脚手架创建react项目安装目录介绍入口文件解析 组件解析介绍函数式组件类组件 事件绑定注意点定义使用事件对象事件处理函数接收额外参数 组件状态状态的定义使用 组件通信父…

Mac 终端可以使用yarn,但是vscode里面报错segmentation fault

Mac 终端可以使用yarn 但是vscode里面报错segmentation fault 查阅官网https://www.yarnpkg.cn/getting-started/install 在vscode运行corepack enable即可解决该问题

嵌入式-stm32-江科大-OLED调试工具

文章目录 一&#xff1a;OLED调试工具1.1 OLED显示屏介绍1.2 实验&#xff1a;在OLED显示屏的使用1.3 自己新增功能测试道友&#xff1a;今天没有开始的事&#xff0c;明天绝不会完成。 一&#xff1a;OLED调试工具 1.1 OLED显示屏介绍 学习任何一门语言就需要进行调试&#…

Spark SQL的高级用法

一. 快速生成多行的序列 需求:请生成一列数据, 内容为 1 , 2 , 3 , 4 ,5 -- 快速生成多行的序列 -- 方式一 select explode(split("1,2,3,4,5",",")); --方式二 /*序列函数sequence(start,stop,step):生成指定返回的列表数据[start,stop]必须传入,step步…