您的位置:首页 > 编程语言 > Go语言

Orthogonal Anagram

2015-08-27 21:39 423 查看

题意

一个字符串的变形词是一个字符串,它含有恰好完全一样的字母,可能以不同的顺序出现。

字符串S和T是正交的,当且仅当它们长度相同,而且每个对应位都不同。

给出一个字符串S,求S的字典序最小的正交变形词。如果这样的字符串不存在,就让答案是空串。

字符串长度n≤50000n\le 50000,所有字符都是小写英语字母。

TimeTime Limits:1000msLimits:1000ms

MemoryMemory Limits:64MLimits:64M

分析

因为要求字典序最小,我们可以考虑贪心。

从前往后,对于每一位,我们枚举它这位放什么字母,那么我们的问题就变成了如何判定这位放了某个字母后是否合法。比较容易想到的是网络流。

对于当前枚举到的位置ii,我们只要知道这位放某个字母后第i+1i + 1 ~ nn位是否存在合法方案。所以源点向每个字母连条容量为当前该字母还能放的个数的边,每个字母向原字符串第i+1i + 1 ~ nn位与该字母不相同的位置连条容量为1的边,i+1i + 1 ~ nn位与汇点连条容量为1的边。若能满流,说明存在合法方案。

但是最坏情况下,网络流会超时。我们需要更快的判定方法。

设对于字符ii,可用字符数为fif_i ,需覆盖字符数为gig_i 。同时总字符数为 lengthlength 。

则有:∀i,fi+gi≤length⇔∀i, f_i + g_i ≤ length ⇔ 本题所构图能够满流 。

必要性显然,充分性可用反证法证明。

这样原题就能很好地解决了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: