首页 > 其他分享 >Largest-Smallest-Cyclic-Shift题解

Largest-Smallest-Cyclic-Shift题解

时间:2023-07-10 18:46:10浏览次数:45  
标签:算法 题解 texttt 最小 表示法 拼接 Smallest Shift 字符串

题目链接

本题码量不大,但是事实上是一道极其难想的思维题。

题目描述

你有 \(a\) 个 a,\(b\) 个 b,\(c\) 个 c。要求用这 \(a+b+c\) 个字母拼接成一个字符串,使得这个字符串的最小表示法在所有能拼成的字符串中最大。

补充:最小表示法,将一个字符串的最后一个字符放到首位,重复这个操作,最终得到的 \(n\) 个字符串中字典序最小的即为它的最小表示法。例如 \(\texttt{abacba}\) 重复上面操作会得到如下字符串:

\[\texttt{abacba,aabacb,baabac,cbaaba,acbaab,bacbaa} \]

它的最小表示法即为 \(\texttt{aabacb}\)。

数据范围:\(a+b+c \le 50\)。

加强版:\(a+b+c \le 10^5\)。


solution

先说下解法吧,首先我不会 ATcoder 给的二分 dp 做法,但是现在的主流做法都是用贪心。

具体算法流程比较简单:

  1. 将所有字符串存下来。
  2. 找到这些字符串中最小的和最大的,拼接到一起后插入,然后删除原来的两个字符串。
  3. 重复 2 操作,直到只剩一个字符串为止。

看起来很简单,但是大部分人其实都想不到(包括我),接下来说一下这个做法的证明。

考虑数学归纳法,假设当你有三个字符串 \(s_1, s_2, s_3\)(假设 \(s_1 < s_2 < s_3\))时,拼接的最优方案为 \(s_1 s_2 s_3\) 成立,那么当我们有一个串 \(s_1s_2\cdots s_k\) 时,有一个另外的字符串 \(s_{k+1}\)(\(s_1<s_2<\cdots < s_{k+1}\)),那么我们把后面 \(s_2s_3\cdots s_k\) 看作一个整体,即为 \(s\),那么易知 \(s<s_{k+1}\)。那么我们可以得到最大的字符串即为 \(s_1 s_{k+1} s\)。

而当最小的情况(\(1\) 个 abc)时,易证该情况成立。

因此我们上面的算法正确。

当然这里还有一点漏洞,就是我们必须保证集合中的所有字符串都为最小表示法。而我们的算法中最小和最大拼接的时候就可以保证这一点性质。因此可以这么做。

代码就不放了,用 multiset 就可以做。时间复杂度 \(O((a+b+c)\log (a+b+c))\)。

标签:算法,题解,texttt,最小,表示法,拼接,Smallest,Shift,字符串
From: https://www.cnblogs.com/crimsonawa/p/17542003.html

相关文章

  • AT-abc214-g题解
    题目描述给定两个排列\(p,q\),要求统计满足\(\foralli,r_i\not=p_i,r_i\not=q_i\)的排列\(r\)的数量。对\(1000000007\)取模数据范围\(n\le3000\)。solution本题要求统计数量,反正我想了半天没想到怎么正向统计(bushi),因此我们考虑容斥。设\(h_i\)为只看其中......
  • P3599题解
    本题是一道比较典的构造题,拿来扩宽扩宽大家的眼界吧。Task1试判断能否构造并构造一个长度为\(n\)的\(1\simn\)的排列,满足其\(n\)个前缀和在模\(n\)的意义下互不相同。很容易想到的一点是:\(n\)一定排在第一位,因为如果排在别的位,加上\(n\)后在模\(n\)意义下是不......
  • CF1421E题解
    题目链接本题作为一道本人思考了50分钟没想出来的大思维题,我觉得可以用来扩宽一下大家的视野。本题中,我们每次都会选取两个相邻的数\(a_i\)和\(a_{i+1}\),同时将这两位变为一位,这一位上填的数为\(-(a_i+a_{i+1})\)。很容易想到的一个\(O(n^3)\)的dp做法是区间dp,设\(f[......
  • NOIP2013-2023题解
    本文章主要是为了不想卷题的时候不是特别颓废而准备本文章是为了总结NOIP最近的题目(为了今年NOIP做准备),目前还没写完,尽量做的全面一些。2013积木大赛给定一个长度为\(n\)的序列\(h_i\),初始有一个全为\(0\)的序列,每次操作可以任意选择\(L,R\),使得\([L,R]\)这段区......
  • CF1545D-题解
    题目链接题目描述有\(n\)个人和\(k\)个间隔相同时间的时刻,每个人都向正方向做匀速直线运动。给出每个时刻(\(0\simk-1\))的所有人的坐标集合(无序),在这\(nk\)个数中有一个数是错误的,找出这个错误的数并将其改正。数据范围:\(5\len\le1000\),\(7\lek\le1000\)。加......
  • 【问题解决】docker login报错 org.freedesktop.Secret.Error.IsLocked: Cannot creat
    问题场景环境docker24.0.2社区版UbuntuServer18.04LTS刚刚执行dockerlogin登录仓库报错:hellxz@bigdata:~/dockerTest$dockerloginharbor.xxx.com.cnUsername:hellxzPassword:**Message:17:26:21.611:Remoteerrorfromsecretservice:org.freedesktop.Se......
  • CF1827D 题解
    problem&blog。很好的题。用到一些关于重心的trick。不妨认为只有一个重心\(\text{maxx}\)。设当前节点数为\(n\),重儿子所在的子树的大小为\(\text{maxsiz}\),那么答案即\(n-2\times\text{maxsiz}\),方法是往重儿子的那个子树爆加节点。因此需要在线维护\(\text{maxx}......
  • CF1601F Two Sorts 题解--zhengjun
    link这里提供一种不用meetinmiddle的方法,速度比较可观。发现性质开始简单的推一下式子。\(\sum(i-a_i)\bmodp=\sum(rk_i-i-p\times\lfloor\frac{rk_i-i}{p}\rfloor)=-p\times\sum\lfloor\frac{rk_i-i}{p}\rfloor,p=998244353\)于是,只需求出\(\sum\lfloor\frac{rk_i-......
  • C++题解——格子游戏
    题目链接:一本通TFLSOJ思路:使用并查集给点连接,如果在连接过程中遇到已连接的点二次连接,就输出代码:#include<bits/stdc++.h>usingnamespacestd;structnode{ intx,y;};nodef[205][205];intn,m;nodefind(nodek){ if(f[k.x][k.y].x==k.x&&f[k.x][k.y].y==k.y)retur......
  • Windows下安装python2和python3双版本及问题解决
    现在大家常用的桌面操作系统有:Windows、MacOS、ubuntu,其中MacOS和ubuntu上都会自带python。这里我们只介绍下Windows(我用的Win10)环境下的python2.x和python3.x的安装,以及python2.x与python3.x共存时的配置问题。本节内容python下载安装Python2.x安装Python3.x当前存......