Anti-Palindromize

题目大意

给定长度为 nn 的字符串 ss,要求找出 ss 的排列 tt 在满足 i[1,n]Ntitni+1\forall i\in [1,n]\cap \mathbb{N}\mid t_i\ne t_{n-i+1} 的情况下使 i=1nbi[si=ti]\sum\limits_{i=1}^{n}b_i\cdot [s_i=t_i] 最大。

其中数据范围满足,1n1001\le n\le 100nn 为偶数且保证有解。

思路

考虑统计出 ss 中每个字符出现的次数 cnticnt_i,将 ss 的一样的字符一起考虑。

将原点 SS 向代表第 ii 种字符的节点连一条流量为 cnticnt_i 费用为 00 的边,这样可以保证在最大流量为 nn 时新的序列 tt 种每种字符出现的次数都是 cnticnt_i,也就是保证 ttss 的一个排列。

因为需要满足 titni+1t_i\ne t_{n-i+1},所以考虑将 tit_itni+1t_{n-i+1} 合并为 11 个点,接着想每一种字母只连一条容量为 11 的边,这样就保证了到达这个点的流量一定来自两个不同的字母。

考虑连边的边权,如果将 chchii 连一条费用为 xx 的边,那么:

x=max([si=x]bi,[sni+1=x]bni+1)x=\max([s_i=x]\cdot b_i,[s_{n-i+1}=x]\cdot b_{n-i+1})

因为如果只有 si=xsni+1=xs_i=x\vee s_{n-i+1}=x,那么如果一定要在一个地方放 xx 那么为了收益最大先让应该将 xx 放在与 ss 相等的地方,这样就可以获得对应的收益。

如果 si=xsni+1=xs_i=x\wedge s_{n-i+1}=x,那么肯定应该将 xx 放在收益最大的地方,因为另一个地方一定不是 xx 所以这样可以让收益最大化。

对于代表 tit_itni+1t_{n-i+1} 的节点,将他们连向 TT 流量为 22 费用为 00,这就保证了这对应的 22 和点一定只有 22 个不同的颜色选择了。

所以直接跑一个网络流就可以了,时间复杂度为 O(n3logn)O(n^3\log n),但是最大流量只有 100100 所以快的一批。

Submission #271715922 - Codeforces