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 ⇔ 本题所构图能够满流 。
必要性显然,充分性可用反证法证明。
这样原题就能很好地解决了。
相关文章推荐
- Goods:注册页面之后台数据验证
- Google APAC 2016 roundA gCampus
- django ajax使用
- LightOJ 1152 - Hiding Gold【二分图】
- [HDU 3966] Aragorn's Story 树链剖分
- 关于google的历史纪录和书签
- POJ 3228 -- Gold Transportation【二分 && 最大流】
- leetcode: (125) Valid Palindrome
- Chrome实验版可同时检查多种语言拼写错误
- Goods:注册页面实现
- 如何下载google play免费应用的apk文件
- 华为oj: 输入n个整数,输出其中最小的k个
- 使用Category 重写frame
- Go语言并发编程(一)
- django学习笔记
- django 日志配置
- zygote oom_score_adj 被设置成1000
- Google 的开源技术protobuf 简介与例子
- 华为oj: 字符串加解密
- 【索引】Geometric Algorithms in 2D::Exercises: Beginner