【Atcoder Grand Contest 020 D】Min Max Repetition

题意:给定\(A,B,C,D\)四个数,要求一个字符串,其中有\(A\)A字符,\(B\)B字符,并且其中最长的连续相同字符子串的长度最小,其字典序最小。问这个字符串的\(C\)~\(D\)位是什么。

思路:首先我们发现这个字符串肯定能表示成以下形式:

A...AB A...AB ... A...AB...B AB...B AB...B ...

即可以分成三段,第一段全是A...AB这样的,第二段是A...AB...B,第三段是AB...B这样的。其中第二段就是第一、三段剩下的。

这样肯定可以保证答案字典序最小。并且每一个A...ABAB...B的长度不超过最长连续相同字符子串的长。

然后我们可以设第一段的长度为\(x\),第三段的长度为\(y\),那么中间一段有\(A-xL-y\)A,\(B-yL-x\)B。其中\(L\)代表最长的连续相同字符子串。

那么我们看看\(L\)怎么求,首先我们假设\(A\ge B\)。那么我们假装ABABABA这样放,但是可能会有的不够放\(B\),那么就需要重复放几个A再放B。每个A的段的数量就是\(L\),即\(\lceil \frac{a}{b+1} \rceil\)

然后就可以求\(x\)\(y\)了。根据鸡兔同笼问题,我们先假设全是AB...B这样的,那么现在用了\(Lb\)A

把一个AB...B改成A...AB会增加\(L-1\)A。那么\(x\)就等于\(\lfloor \frac{Lb-a}{L-1} \rfloor\)

同理可以算出\(y\)

那么把\(c...d\)中每一个数属于哪一个段,是第几个讨论一下就好了。

猜你喜欢

转载自www.cnblogs.com/denverjin/p/10813910.html