09 2013 档案

摘要:题意:舞会上,男孩和女孩配对,求最大完全匹配个数,要求每个人最多与k个不喜欢的人配对,且每次都和不同的人配对。分析:将一个点拆成3个点. b, b1, b2.从1到n枚举ans,判可行流. 源点s到每个b连一容量为ans边,b->b1容量inf, b->b2容量为k, 每个g到汇点连一容量为ans的边,g->g1容量inf, g->g2容量为k, 如果一个boy喜欢一个girl, 则连一条边b1->g1,容量为1, 如果一个boy讨厌一个girl, 则b2->g2, 容量为1.满足可行流条件: 最大流==ans*n. (n为boy或者girl数)// Fil 阅读全文
posted @ 2013-09-11 20:18 z.arbitrary 阅读(519) 评论(0) 推荐(0)
摘要:题意:给出最少栏杆数使狼和羊分离分析:将狼与源点连,羊与汇点连,容量都为无穷,将图的各个相邻点连接,容量为1然后题目就转化成最小去掉多少条边使不连通,即求最小割最大流.// File Name: 3046.cpp// Author: Zlbing// Created Time: 2013/9/10 20:41:04#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define CL(x,v); memset(x, 阅读全文
posted @ 2013-09-10 21:03 z.arbitrary 阅读(805) 评论(3) 推荐(0)
摘要:题意:给定 n 个字符串,求出现在不小于 k 个字符串中的最长子串。分析:将 n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组。然后二分答案,将后缀分成若干组,判断每组的后缀是否出现在不小于 k 个的原串中。如果是大于127, char 是负数, 在计数排序的时候是会出问题的。这题在输出上WA了很多次。最后下载了数据才找出来的。。。。// File Name: 3294.cpp// Author: Zlbing// Created Time: 2013年09月07日 星期六 16时21分37秒#include#include#include#include#incl 阅读全文
posted @ 2013-09-08 20:18 z.arbitrary 阅读(215) 评论(0) 推荐(0)
摘要:题意:长度不小于 k 的公共子串的个数分析:基本思路是计算 A 的所有后缀和 B 的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于 k 的部分全部加起来。先将两个字符串连起来,中间用一个没有出现过的字符隔开。按 height 值分组后,接下来的工作便是快速的统计每组中后缀之间的最长公共前缀之和。扫描一遍,每遇到一个 B 的后缀就统计与前面的 A 的后缀能产生多少个长度不小于 k 的公共子串,这里 A 的后缀需要用一个单调的栈来高效的维护。然后对 A 也这样做一次。// File Name: 3415.cpp// Author: Zlbing// Created Time: 2013 阅读全文
posted @ 2013-09-08 16:08 z.arbitrary 阅读(979) 评论(0) 推荐(0)
摘要:题意:给定两个字符串 A 和 B,求最长公共子串。分析:字符串的任何一个子串都是这个字符串的某个后缀的前缀。求 A 和 B 的最长公共子串等价于求 A 的后缀和 B 的后缀的最长公共前缀的最大值。如果枚举 A和 B 的所有的后缀,那么这样做显然效率低下。由于要计算 A 的后缀和 B 的后缀的最长公共前缀,所以先将第二个字符串写在第一个字符串后面,中间用一个没有出现过的字符隔开,再求这个新的字符串的后缀数组。观察一下,看看能不能从这个新的字符串的后缀数组中找到一些规律。以 A=“aaaba”,B=“abaa”为那么是不是所有的 height 值中的最大值就是答案呢?不一定!有可能这两个 后 缀 阅读全文
posted @ 2013-09-07 15:13 z.arbitrary 阅读(351) 评论(0) 推荐(0)
摘要:题意:给出一个串,求重复次数最多的连续重复子串分析:比较容易理解的部分就是枚举长度为L,然后看长度为L的字符串最多连续出现几次。既然长度为L的串重复出现,那么str[0],str[l],str[2*l]……中肯定有两个连续的出现在字符串中。那么就枚举连续的两个,然后从这两个字符前后匹配,看最多能匹配多远。即以str[i*l],str[i*l+l]前后匹配,这里是通过查询suffix(i*l),suffix(i*l+l)的最长公共前缀通过rank值能找到i*l,与i*l+l的排名,我们要查询的是这段区间的height的最小值,通过RMQ预处理达到查询为0(1)的复杂度,设LCP长度为M, 则答案 阅读全文
posted @ 2013-09-06 21:54 z.arbitrary 阅读(972) 评论(0) 推荐(0)
摘要:题意:给定一个字符串,求不相同的子串的个数分析:每个子串一定是某个后缀的前缀,那么原问题等价于求所有后缀之间的不相同 的 前 缀 的 个 数 。如 果 所 有 的 后 缀 按 照 suffix(sa[1]), suffix(sa[2]),suffix(sa[3]), ...... ,suffix(sa[n])的顺序计算,不难发现,对于每一次新加进来的 后缀 suffix(sa[k]), 它将产生 n-sa[k] 个新 的前缀。但 是其中有height[k]个是和前面的字符串的前缀是相同的。所以 suffix(sa[k])将“贡献”出 n-sa[k]- height[k]个不同的子串。累加后便是 阅读全文
posted @ 2013-09-06 14:00 z.arbitrary 阅读(234) 评论(0) 推荐(0)
摘要:题意:给定一个字符串,求至少出现k 次的最长重复子串,这k 个子串可以重叠。分析:先二分答案,然后将后缀分成若干组。不同的是,这里要判断的是有没有一个组的后缀个数不小于k。如果有,那么存在k 个相同的子串满足条件,否则不存在。这个做法的时间复杂度为O(nlogn)。// File Name: 3261.cpp// Author: Zlbing// Created Time: 2013年09月04日 星期三 21时21分51秒#include#include#include#include#include#include#include#include#include#include#inclu 阅读全文
posted @ 2013-09-05 22:36 z.arbitrary 阅读(242) 评论(0) 推荐(0)
摘要:题意:找到一个字符串内长度不小于五的可不重叠的最长重复子串,子串的所有数字同时加上或减去一同一个数这时两个字串重复也算重复出现。分析:首先最所有数字作差,s[i]=s[i+1]-s[i],这样一来及时原先的字串是进行过加或减那他们的差值也会相同,所以转换为求现有s[]中大与5的最长重复字串,用后缀数组。首先由二分答案的方法将问题变成判定性的:长度大于k的重复字串有没有?然后将height数组分组,每组内的后缀之间的height都要大于k,如果每组内的后缀之间的最长公共前缀有大于k的而且这两个后缀的sa[]之差大于k就说明存在长度至少为k的不重复子串。求最长公共前缀就要用到height数组,因为 阅读全文
posted @ 2013-09-05 21:13 z.arbitrary 阅读(248) 评论(0) 推荐(0)
摘要:引用自HH大牛的模板http://www.notonlysuccess.com/index.php/sa/// File Name: suffix.cpp// Author: Zlbing// Created Time: 2013年09月04日 星期三 19时57分46秒#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define CL(x,v); memset(x,v,sizeof(x));#define I 阅读全文
posted @ 2013-09-05 21:06 z.arbitrary 阅读(768) 评论(0) 推荐(0)