摘要: 题意:给定一串字符(互异),再给出一个字符序列,表示一种前后关系,如abefcd,表示a<b,e<f,c<d。将开始给出的字符进行排序,使之符合这个关系序列。并按字典序输出这些符合要求的字符序列。例如:a b f ga b b f 结果是:abfgabgfagbfgabf分析:这题就是一个给定部分顺序,来确定整体顺序的拓扑排序。但一般的拓扑排序只找出一种符合要求的序列,这题要求找出所有符合要求的序列,这就有点困难,所以还得加上回溯算法。最后对求出的所有符合要求的序列进行排序输出就可以了。代码:每次写递归都TM有种向吐血的赶脚!!!View Code 1 #include &l 阅读全文
posted @ 2012-08-23 15:54 pushing my way 阅读(717) 评论(0) 推荐(0) 编辑
摘要: 题意:有n头牛比赛,m种比赛结果,最后问你一共有多少头牛的排名被确定了,其中如果a战胜b,b战胜c,则也可以说a战胜c,即可以传递胜负。求能确定排名的牛的数目。分析:如果一头牛被x头牛打败,打败y头牛,且x+y=n-1,则我们容易知道这头牛的排名就被确定了,所以我们只要将任何两头牛的胜负关系确定了,在遍历所有牛判断一下是否满足x+y=n-1,将满足这个条件的牛数目加起来就是所求解。抽象为简单的floyd传递闭包算法,在加上每个顶点的出度与入度 (出度+入度=顶点数-1,则能够确定其编号)。传递闭包的定义:G的传递闭包定义为G*=(V,E*),其中E={(i,j):图G中存在一条从i到j的路径} 阅读全文
posted @ 2012-08-23 11:31 pushing my way 阅读(1648) 评论(0) 推荐(0) 编辑
摘要: 题意:给你一些大写字母间的偏序关系,然后让你判断能否唯一确定它们之间的关系,或者所给关系是矛盾的,或者到最后也不能确定它们之间的关系。分析:用拓扑排序:1.拓扑排序可以用栈来实现,每次入栈的是入度为0的节点。1.拓扑排序的结果一般分为三种情况:1、可以判断2、有环出现了矛盾3、条件不足,不能判断.2.这道题不仅需要判断这三种情况,而且还要判断在处理第几个关系时出现前两种情况,对于本道题来说三种情况是有优先级的。前两种情况是平等的谁先出现先输出谁的相应结果,对于第三种情况是在前两种情况下都没有的前提下输出相应结果的.网上对于这道题的错误提示:1.本题顺序:a.先判有没有环,有环就直接输出不能确定 阅读全文
posted @ 2012-08-23 10:48 pushing my way 阅读(2302) 评论(0) 推荐(0) 编辑
摘要: 题意:给出n个点的m条约束信息。每条信息表述为(P a b c)表示a在b北方距离c的位置,或者(V a b) 表示a在b北方1单位距离或者更远的位置。问是否可能存在符合以上m个要求的点。分析:根据题意首先我们可以确定已知条件是一个差分约束系统,建立此系统:p a b c:xb-xa=c 即:xb-xa>=c && xb-xa<=c -----> xa-xb<=-c && xb-xa<=cv a b:xb-xa>=1 ------> xa-xb<=-1.然后将差分约束系统转化成约束图。图单源最短路存在 ----&g 阅读全文
posted @ 2012-08-21 14:53 pushing my way 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 这个最小生成树的题比较简单,但是需要注意:Kruskal不适合稠密图中,这个题是稠密图,用kruskal800+ms,而prim400ms.还有cin和scanf的耗时差距好大啊。prim代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 using namespace std; 4 //454ms 5 const int maxnum=2001; 6 const int maxdigit=(1<<30); 7 int array[maxnum][maxnum]; 8 int close[max 阅读全文
posted @ 2012-08-21 08:49 pushing my way 阅读(206) 评论(0) 推荐(0) 编辑
摘要: AC自动机:一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。如果你对KMP算法和了解的话,应该知道KMP算法中的next函数(shift函数或者fail函数)是干什么用的。KMP中我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符,当A[i+1]≠B[j+1],KMP的策略是调整j的位置(减小j值)使得A[i-j+1.. 阅读全文
posted @ 2012-08-21 08:41 pushing my way 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 后缀:Suffix(i)=r[i..len(r)]。对于同一个字符串,两个开头位置不同的后缀 u 和 v 进行比较的结果不可能是相等,因为 u=v 的必要条件 len(u)=len(v) 在这里不可能满足。后缀数组:后缀数组SA是一个一维数组,它保存1..n的某个排列 SA[1 ] ,SA[2] ,…… ,SA[n] ,并且保证 Suffix(SA[i]) < Suffix(SA[i+1]) ,1 ≤ i<n 。也就是将字符串S的n个后缀从小到大进行排序之后把排好序的后缀的开头位置顺次放入SA中。名次数组:名次数组Rank[i]保存的是Suffix(i)在所有后缀中从小到大排列的“ 阅读全文
posted @ 2012-08-20 16:57 pushing my way 阅读(286) 评论(0) 推荐(0) 编辑
摘要: 题意:FJ有n头牛(编号为1~n),每一头牛都有一个测验值[S, E],如果对于牛i和牛j来说,它们的测验值满足下面的条件则证明牛i比牛j强壮:Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj。现在已知每一头牛的测验值,要求输出每头牛有几头牛比其强壮。分析:将[s,e]看成是而为坐标轴的横纵坐标,画出各个点,我们发现答案就是每个点左上的点的个数。将e降序,再将s升序,就可以转化成一维。例如:1 21 20 33 4,排序后为3 40 31 21 2,这样就转化成横坐标前面小于它的个数。这个题离散到大于等于1的范围内即可。难点是,对重复坐标 阅读全文
posted @ 2012-08-19 11:11 pushing my way 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 这个题的第二个版本:同2299_II,也是压缩到1--n范围内,找出已知序列的相对顺序,然后构建树状数组。这里也需要一个辅助的数组。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 #include <algorithm> 5 using namespace std; 6 //516k 188ms 7 const int maxnum=15001; 8 struct node 9 {10 int digit;11 int number;1 阅读全文
posted @ 2012-08-19 10:39 pushing my way 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 这个题做过了,今天是树状数组的另一个版本。分析:例如 9 1 0 5 4一般数据小的话,我们求每个数字前面小于等于它的个数,只需要离散到大于等于1的范围内。9: update(10),sum(10) --->11: update(2),sum(2)--->10: update(1),sum(0)--->15: update(6),sum(6)--->34: update(5),sum(5)--->3但是这个题数据范围很大,因此必须得压缩一下注意到 9在序列中第5大,1第2大,。。。。因此,将 9 1 0 5 4替换成5 2 1 4 3做树状数组是不变的然后对应的5 阅读全文
posted @ 2012-08-18 19:00 pushing my way 阅读(312) 评论(0) 推荐(0) 编辑