[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\) 中间留出的字符无法被联通。

很容易就能想到直接把奇数的两段放在最左边和最右边,仔细想想是对的。

posted @ 2024-06-16 22:07  cxqghzj  阅读(2)  评论(0编辑  收藏  举报