[AGC001D] Arrays and Palindrome
题意
有长度为 \(n\) 的字符串 \(S\),与 \(a, b\) 两个序列。
满足 \(\sum a_i = n, \sum b_i = n\)。
若满足 \(S\) 的以下子段都为回文串:
- 最前面的 \(a_1\) 个字符,以及紧接着的 \(a_2\) 个字符...
- 最前面的 \(b_1\) 个字符,以及紧接着的 \(b_2\) 个字符...
则 \(S\) 的所有字符相等。
现在告诉你长度为 \(m\) 的 \(a\) 任意排列的结果。
试确定 \(b\) 的长度与方案。
Sol
考虑形式化这个东西。
连边表示相连的两个字符相等,可以发现实际上回文的限制可以连一系列的边。
若要使得可以确定所有字符相等,则边数至少为 \(n - 1\)。
假设所有回文子段都为偶数,显然边数为 \(2 \times \lfloor \frac{n}{2} \rfloor\)。
注意到若回文的子段长度为奇数,可以当作少了一条边。
因此显然两个序列里奇数的个数不会超过 \(2\)。
这样可以将不合法的情况判掉。
手玩一下可以发现,若 \(a_i = b_i\),只需要将 \(b_i\) 平移一格就能全部对上了。
而且这样两个度数为 \(1\) 的点都在两侧,十分美观。
可以想到考虑给 \(b_1 = a_1 + 1, b_n = a_n - 1\),来对 \(b\) 序列平移。
注意到这样的话会导致中间的奇数的 \(a_i\) 中间留出的字符无法被联通。
很容易就能想到直接把奇数的两段放在最左边和最右边,仔细想想是对的。