最新要闻
- 全球播报:雷军:小米13用了昂贵的高硅负极电池才把容量做到4500mAh
- 把魔兽停服当庆典营销 网易《逆水寒》被曝涉嫌抄袭暴雪IP
- 当前热讯:《黑神话:悟空》定档:想玩记得升级电脑
- 快播:2022年预制菜销量大涨!之前有专家还说“我从来不吃”
- 世界报道:高铁站大厅没插座 客服:为了消防安全
- 滚动:你遇到过没?货车安装超亮后射灯:夜晚跟车根本看不清
- 时讯:首发2亿像素HP2!三星Galaxy S23 Ultra万元机皇来了
- 观察:口碑爆棚!剧版《三体》市占率16.51%排行第一
- 年终会员大促:B站/芒果TV/腾讯视频/优酷/百度网盘3.6折起
- 三电机真恐怖!特斯拉Model S Plaid瞬间撕裂马力机张力带
- 焦点热讯:内置LED屏见过没?Naspec推出高端HDMI 2.1数据线
- 焦点要闻:美国一州提案禁售电动汽车 议员:就看不惯“禁售燃油车”的提议
- 环球热门:电动车新国标过渡期陆续到期 雅迪股价半月暴涨3成
- 合作谈崩了 暴雪还想让网易当半年“备胎”?
- 特斯拉Model S之后:一改装公司推出福特电马灵车和礼宾车
- 今日讯!魅族Flyme牵手中国电信天翼终端!软硬件生态全面融合
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界热门:C. Equal Frequencies
C. Equal Frequencies
Let"s call a string balanced if all characters that are present in it appear the same number of times. For example, "coder", "appall", and "ttttttt" are balanced, while "wowwow" and "codeforces" are not.
You are given a string $s$ of length $n$ consisting of lowercase English letters. Find a balanced string $t$ of the same length $n$ consisting of lowercase English letters that is different from the string $s$ in as few positions as possible. In other words, the number of indices $i$ such that $s_i \ne t_i$ should be as small as possible.
【资料图】
Input
Each test contains multiple test cases. The first line contains the number of test cases $t$ ($1 \le t \le 10^4$). The description of the test cases follows.
Each test case consists of two lines. The first line contains a single integer $n$ ($1 \le n \le 10^5$) — the length of the string $s$.
The second line contains the string $s$ of length $n$ consisting of lowercase English letters.
It is guaranteed that the sum of $n$ over all test cases does not exceed $10^5$.
Output
For each test case, print the smallest number of positions where string $s$ and a balanced string $t$ can differ, followed by such a string $t$.
If there are multiple solutions, print any. It can be shown that at least one balanced string always exists.
Example
input
45hello10codeforces5eevee6appall
output
1helno2codefofced1eeeee0appall
Note
In the first test case, the given string "hello" is not balanced: letters "h", "e", and "o" appear in it once, while letter "l" appears twice. On the other hand, string "helno" is balanced: five distinct letters are present in it, and each of them appears exactly once. Strings "hello" and "helno" differ in just one position: the fourth character. Other solutions are possible too.
In the second test case, string "codefofced" is balanced since only letters "c", "o", "d", "e", and "f" are present in it, and each of them appears exactly twice.
In the third test case, string "eeeee" is balanced since only letter "e" is present in it.
In the fourth test case, the given string "appall" is already balanced.
解题思路
写这题分为两部,先找出最小改变次数,再对字符串进行修改。
可以发现,由于最后字符串中每种字符的出现次数都相同,因此还是很容易想到枚举最后有多少种字符来求最小改变次数。假设最后有$i$种字符,那么$i$要满足$i \mid n$,同时每种字符都有$s = \frac{n}{i}$个。统计字符串中每个字符的出现次数,并按照个数从大到小排序。为了得到最小的改变次数,贪心的思路是保留前$i$种字符,然后把从第$i+1$个字符开始的剩余字符都删掉(如果有的话),当然如果不同种类的字符不足$i$个,那么意味需要额外添加其他种类的字符。这里的删除是指把该字符换成前$i$个原本存在的字符种类,添加是指把该字符换成原本不存在的字符种类。假设改变次数为$t$,枚举前$i$个字符如果该字符的出现的次数$c \ne s$,那么$t$就要加上$|s-c|$;然后再枚举剩下字符,这些字符都是要删掉的,因此$t$要加上这些字符出现的次数。枚举完所有的$i$取最小的$t$就是答案,最后答案还有除以$2$,因为一次修改被算了两次(删除和添加)。
关于上面贪心的正确性说明,这里是选择保留出现次数多的字符而删除出现次数少的字符,上面求$t$的公式为$t = \sum\limits_{k = 0}^{i - 1} {|s - c_k|} + \sum\limits_{k = i}^{25} {c_k}$。假设有字符$x$和$y$,个数分别为$c_x$和$c_y$,如果保留$y$而删除$x$,变化后数值就变成$t - \left( {|s - c_x| + c_y} \right) + |s - c_y| + c_x$,如果贪心是正确的话,那么变化后的$t$应该是变大的。因此我们要证明出$|s - c_y| + c_x \geq |s - c_x| + c_y$,才能保证贪心的正确性,然后我试着证明了一下,可以参考下面的附录部分。
最后是修改字符了,当时比赛时太急了没想出来,补题时发现确实还是蛮复杂的。
根据上面的求最小出现次数的过程我们就已经得到了最后要保留的字符种类个数,这里记为$\text{sum}$,以及每种字符保留的个数$s$。然后我们要做的是根据前面统计出来的字符出现次数来替换字符串中的字符,当枚举到$\text{str}[i]$,如果字符$\text{str}[i]$的出现次数大于$s$,那么我们就要把$\text{str}[i]$换成出现次数小于$s$的字符种类;如果字符$\text{str}[i]$的出现次数小于$s$就不用管了,因为后面一定会存在大于$s$的字符。
实现的方法是先算出每个字符需要添加或删除的数量,具体做法是根据前面统计出来的每种字符出现次数,记为数组$\text{cnt}$,把前$\text{sum}$个字符都减去$s$,如果得到的结果大于$0$则说明该需要将该种类的字符替换成结果小于$0$的字符。第$\text{sum}+1$个开始之后的字符就不用管了,如果存在则对应的$\text{cnt}$必定为正数,说明需要进行替换且出现的次数就是要被替换的次数。在修改字符串的过程中开一个指针$j$指向第$\text{sum}$个字符,每次枚举到下一个字符前都检查一下$j$所指向的字符在$\text{cnt}$中是不是小于$0$,不是的话就往前移。当发现$\text{cnt}[\text{str}[i]] > 0$,则将$\text{str}[i]$替换成$j$指向的字符,同时$\text{cnt}$进行相应的修改。
AC代码如下:
1 #include2 using namespace std; 3 4 const int N = 1e5 + 10; 5 6 char str[N]; 7 int cnt[26], p[26]; 8 9 void solve() {10 int n;11 scanf("%d %s", &n, &str);12 memset(cnt, 0, sizeof(cnt));13 for (int i = 0; i < n; i++) {14 cnt[str[i] - "a"]++; // 统计原字符串每个字符出现的次数15 }16 for (int i = 0; i < 26; i++) {17 p[i] = i;18 }19 sort(p, p + 26, [&](int i, int j) { // 字符按照出现次数从大到小排序20 return cnt[i] > cnt[j];21 });22 int ret = n, sum; // ret记录修改的次数,sum记录最后字符串中字符的种类个数23 for (int i = 1; i <= 26; i++) { // 枚举字符的种类,最多有26种24 if (n % i == 0) {25 int s = n / i, t = 0;26 for (int j = 0; j < i; j++) { // 前i个字符要保留27 t += abs(cnt[p[j]] - s);28 }29 for (int j = i; j < 26; j++) { // 剩余的字符都要删除30 t += cnt[p[j]];31 }32 if (ret > t / 2) ret = t / 2, sum = i; // 答案记得除以233 }34 }35 for (int i = 0; i < sum; i++) {36 cnt[p[i]] -= n / sum; // cnt[p[i]]>0,表示需要把字符p[i]需要替换成<0的字符37 }38 for (int i = 0, j = sum - 1; i < n; i++) {39 while (j >= 0 && cnt[p[j]] >= 0) { // j指向cnt[p[j]]<0的字符,表示要替换成p[j]40 j--;41 }42 if (cnt[str[i] - "a"] > 0) { // 修改str[i]43 cnt[str[i] - "a"]--, cnt[p[j]]++; // 消除44 str[i] = p[j] + "a"; // 替换成p[j]45 }46 }47 printf("%d\n%s\n", ret, str);48 }49 50 int main() {51 int t;52 scanf("%d", &t);53 while (t--) {54 solve();55 }56 57 return 0;58 }
附录
已知 $c_x \geq c_y$ ,
求证 $|s - c_y| + c_x \geq |s - c_x| + c_y$ 。
证明:$$\begin{align*}|s - c_x| + c_y - \left( |s - c_y| + c_x \right) &= c_y - c_x + |s - c_x| - |s - c_y| \\&\leq c_y - c_x + |c_x - c_y| \\&\leq 0\end{align*}$$即得$$|s - c_x| + c_y \leq |s - c_y| + c_x$$
得证。
主要是我忘了不等式$$|a|-|b| \leq |a \pm b| \leq |a|+|b|$$一直记的是$$|a|-|b| \leq |a + b| \leq |a|+|b|$$不过如果我反过来证貌似得不到结果:$$\begin{align*}|s - c_y| + c_x - \left( |s - c_x| + c_y \right) &= c_x - c_y + |s - c_y| - |s - c_x| \\&\leq c_x - c_y + |c_x - c_y| \\&\leq 2 \cdot (c_x - c_y)\end{align*}$$写到这里的时候我想到 $s$ 可以分类讨论:
- 当 $c_y \leq s \leq c_x$ :$$\begin{align*}|s - c_y| + c_x - \left( |s - c_x| + c_y \right) &= c_x - c_y + |s - c_y| - |s - c_x| \\&= c_x - c_y + (s - c_y) - (c_x - s) \\&= c_x - c_y + 2 \cdot s - c_y - c_x \\&= 2 \cdot (s - c_y) \geq 0\end{align*}$$
- 当 $s < c_y$ :$$\begin{align*}|s - c_y| + c_x - \left( |s - c_x| + c_y \right) &= c_x - c_y + |s - c_y| - |s - c_x| \\&= c_x - c_y + (c_y - s) - (c_x - s) \\&= c_x - c_y + c_y - c_x \\&= 0\end{align*}$$
- 当 $s > c_x$ :$$\begin{align*}|s - c_y| + c_x - \left( |s - c_x| + c_y \right) &= c_x - c_y + |s - c_y| - |s - c_x| \\&= c_x - c_y + (s - c_y) - (s - c_x) \\&= c_x - c_y + c_x - c_y \\&= 2 \cdot (c_x - c_y) \geq 0\end{align*}$$
综上所述$$|s - c_y| + c_x - \left( |s - c_x| + c_y \right) \geq 0$$同时得到不等式的上下界:$$0 \leq |s - c_y| + c_x - \left( |s - c_x| + c_y \right) \leq 2 \cdot (c_x - c_y)$$
得证。
参考资料
Codeforces Round #844 (Div. 1 + Div. 2, based on VK Cup 2022 - Elimination Round) A-D:https://www.cnblogs.com/BlankYang/p/17056807.html
关键词: 原字符串
-
世界热门:C. Equal Frequencies
C EqualFrequenciesLet& 39;scallastringbalancedifallcharactersthatarepresentinitappea
来源: 世界热门:C. Equal Frequencies
全球播报:雷军:小米13用了昂贵的高硅负极电池才把容量做到4500mAh
世界简讯:Qt项目-翻金币游戏
lambda表达式基础
java-数组相关的算法(尚硅谷)
Pytorch-geometric: Creating Message Passing Networks 构建消息传递网络教程
把魔兽停服当庆典营销 网易《逆水寒》被曝涉嫌抄袭暴雪IP
当前热讯:《黑神话:悟空》定档:想玩记得升级电脑
快播:2022年预制菜销量大涨!之前有专家还说“我从来不吃”
7层WAF的一些记录
天天新动态:Numpy基本使用方法
[数据结构]单向链表插入排序(C语言)
世界报道:高铁站大厅没插座 客服:为了消防安全
滚动:你遇到过没?货车安装超亮后射灯:夜晚跟车根本看不清
时讯:首发2亿像素HP2!三星Galaxy S23 Ultra万元机皇来了
观察:口碑爆棚!剧版《三体》市占率16.51%排行第一
当前要闻:BC4-牛牛学说话之-浮点数
【独家焦点】关于可迭代对象、迭代器对象、生成器对象
环球快消息!AcWing 1077. 皇宫看守
年终会员大促:B站/芒果TV/腾讯视频/优酷/百度网盘3.6折起
三电机真恐怖!特斯拉Model S Plaid瞬间撕裂马力机张力带
焦点热讯:内置LED屏见过没?Naspec推出高端HDMI 2.1数据线
焦点要闻:美国一州提案禁售电动汽车 议员:就看不惯“禁售燃油车”的提议
环球热门:电动车新国标过渡期陆续到期 雅迪股价半月暴涨3成
vue3_ts_defineProps的使用
合作谈崩了 暴雪还想让网易当半年“备胎”?
特斯拉Model S之后:一改装公司推出福特电马灵车和礼宾车
今日讯!魅族Flyme牵手中国电信天翼终端!软硬件生态全面融合
学习笔记——定义切面优先级 ;Spring中的JdbcTemplate;JdbcTemplate的常用API
当前短讯!从0开始学Java 第一期 开发前的准备
小心吃官司 央视发布声明:2023兔年春晚内容别乱用
世界焦点!华硕发布Vivobook S 16 Flip笔记本:16寸3.2K OLED翻转屏
快播:联想一大波ThinkBook笔记本来袭:全新一代处理器 32G内存
天天时讯:国服还能玩6天:《守望先锋:归来》开启春节活动
天天速看:国家级出行平台!“强国交通”完成内测即将上线:接入微信、支付宝等
天天热门:研发回家过年了,留下这个低代码开源平台真好用!
天天热门:Python基础之函数
小米城市定制机来了!小米13信阳专属版今日交付:包装盒独一无二
网易、暴雪骂战正酣 NVIDIA站台《永劫无间》:即将支持DLSS3
环球速看:火锅店回应起火后要求顾客先结账:网友甩出一张神图
世界报道:《三体》电视剧从北京正负电子对撞机取景 物理学家纷纷追剧
全球今日报丨越跌越买!特斯拉降价是“好时机”:木头姐仍在大举加仓
全球关注:SSH 远程免密登录(公钥登录)
世界观速讯丨达到你城市标准没?去年白领平均年终奖8428元:仅1城连涨三年 到手先存
今日精选:大品牌好价!振德医用外科、KN95口罩29.9元起包邮
世界观察:互联网公司春节红包缩水一半:快手最豪横 狂撒20亿元
【独家焦点】50GB包年39元!小米云服务会员春节福利:最低5.5折
世界聚焦:SpaceX重型猎鹰火箭发射美国太空军机密卫星:不怕核打击
快资讯:opencv官网例程(4.7.0版本)运行示例
【优秀论文解读】BoW3D: Bag of Words for Real-time Loop Closing in 3D LiDAR SLAM
学习笔记——Spring中的AOP(AspectJ);Spring中AOP概述;Spring中AOP相关术语;AspectJ中切入点表达式;AspectJ中Jo
当前热讯:峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?
改款特斯拉Model 3即将登场:预计今年三季度投产
苹果版“望远镜”!曝iPhone 16 Pro/16 Ultra都会配备潜望长焦
科学家警告:2024或成全球史上最热年份
天天短讯!读编程与类型系统笔记10_泛型算法和迭代器
精选!【K哥爬虫普法】辛苦钱被中间商抽走八成,还因此锒铛入狱
育碧CEO让员工少花钱多做事 巴黎工作室将罢工抗议
苹果上海被强制执行1.44亿:这么多年还是第一次
世界通讯!微软否认“万人大裁员”:纯属谣言
天天讯息:7岁男孩爱撕倒刺致手指感染 医生提醒:处理不当会引发骨髓炎
全球今亮点!春节正常发货:仁和N95灭菌级口罩25片15.9元大促
世界要闻:网友3美元淘了一颗废品锐龙9 5900X:掰正针脚 点亮!
王晶武侠电影 《天龙八部之乔峰传》明日首映:年三十三大视频平台上线
Appuploader内测版本详解
热点评!使用Python的一维卷积
全球时讯:平民也能玩8GHz超频 技嘉B760主板奉上两大绝技:内存延迟大降7ns
被偷家了!德国人不买大众 把美系车特斯拉买成销冠
12nm后 DRAM怎么办?EUV光刻也不是万能药
每日时讯!安徽一劳斯莱斯婚车撞上石墩受损严重 博主:可向设置限宽人员索赔
《蚁人3:量子狂潮》角色海报发布 蚁人女儿貌美如花
象是哪个少数民族的生肖?十二生肖儿歌顺口溜
释迦牟尼佛成道日是哪一天?释迦牟尼佛的故事
国税地税税种有哪些?国税地税税种比例怎么分?
家有恶邻后面一句是什么?家有恶邻居怎么办?
最资讯丨学习笔记——AOP-代理模式
Python使用pyppeteer搭建网页截图api
三星移动硬盘质量怎么样?三星移动硬盘打不开怎么解决?
帅康燃气灶怎么样?帅康燃气灶打火后松手就熄灭怎么解决?
qq服务器拒绝发送离线文件是什么意思?qq服务器拒绝发送离线文件怎么办?
什么八字的人长得好看?什么八字的人长得丑?
光波炉的危害有哪些?光波炉与微波炉的区别
移动硬盘目录损坏如何恢复?移动硬盘目录损坏解决方法
今日快讯:官宣:F1中国站无缘2023赛季 已连续4年缺席
世界热文:开发预算突破7亿!网易400人团队“超级项目”《逆水寒》手游获批版号
天天快报!2023全球品牌价值500强出炉:苹果跌至第2 抖音杀入前10
全球观察:买一赠一:腾讯视频京东Plus会员联名年卡148元大促
《魔兽世界》电子骨灰盒出现bug:下载存档错误 账号被锁定
全球快消息!APM vs NPM
排面!小米登上《人民日报》头版
情侣拍照时戒指不慎掉入洱海 男生立即跳湖寻找:官方回应太危险不可取
天天热文:吃播账号“浪胃仙”被判属原公司:创始人涉职务侵占被捕
全球今日讯!学习笔记——Spring中组件扫描(包含扫描、排除扫描)、Spring中完全注解开发;Spring整合Junit4步骤
10辆特斯拉新车高速上集体燃烧 只剩一堆废铁架子
美国科技巨头依然寒气逼人 微软即将裁员:1万多人丢了工作
每日消息!《最后生还者》热播 收视率仅次于《龙之家族》
全球百事通!别人“借钱不还”怎么办?网友公布微信妙招 赶紧学起来
全球快资讯丨1月23日国服停!双方谈崩 网友吐槽暴雪绿茶:网易后到底谁来接盘?
世界热资讯!冬天加油枪都被冻住了 网友吐槽:国六B汽油里水加多了
当前关注:彻底闹掰!网易:暴雪提议蛮横 不符合商业逻辑