CF1493C K-beautiful Strings
26字符每种出现的次数都得被k整除,这样的字符串是好字符串。
你要求找一个字典序大于给定字符串的长度相同的第一个(字典序最小)的好字符串。
感觉位置顺序和字符顺序,两种顺序都得考虑。
我们先构造好字符串,然后想办法调整使得字典序第一个>给定字符串。
感觉现在心绪不宁,注意力没法集中。
首先,我想到了数位DP。
如果说给定的字符串s,构造的字符串t
那么t必然有一段前缀与s相同(或者没有)
然后从位置k开始,t[k]>s[k]。
我们知道如果t[k]>s[k]+1的话,我们可以把字符串中的t[k]与s[k]+1整个字符互相替换。
可以发现,好的字符串,整体替换两种字符后,依然是个好字符串。
因此t[k]=s[k]+1
这一步就实现了字典序>s的目标了,剩下的就是添上其余部分,让t字典序尽量小。
总的算法就是枚举k,对每个k构造出的t取一个字典序最小的输出。
现在,k已经固定了,为了保证字符串是好的,我们后续至少要添加一些字符来平衡前缀出现过的字符。注意,这是只在数量上,而顺序任由我们决定。
当添加了最少数量的字符平衡前缀字符后,剩下的长度,全部选用a来填充。
如果剩下的长度不能被k整除,显然对应的t是无解的。
这样复杂度就是O(26*N)

浙公网安备 33010602011771号