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)

 

posted @ 2021-03-12 15:57  AngelKnows  阅读(96)  评论(0)    收藏  举报