Visitors hit counter dreamweaver

04 2012 档案

摘要:这题的意思是要求最短距离中的最大值。一看题目,要求来回的距离,就想到用floyd。看了看数据,觉得不行呀。看了discuss,果然floyd过不了的。看别人推荐的好的方法:1.Dijkstra;2.SPFA.不过两个方法都要用到矩阵的转置。这样才能求到来回的最短路径。第一次是求X到其它各点的最短距离(也即回来的距离),转置后,再次求X到其它点的距离,就可以得到其它各点到X的最短距离。很巧妙! 再次练习Dijkstra方法。要想掌握一个算法,那就必须多次敲!多次!多次!Dijkstra:#include <iostream>#include <fstream>using 阅读全文
posted @ 2012-04-29 17:58 Jason Damon 阅读(1289) 评论(0) 推荐(0) 编辑
摘要:好久不写心灵日记咯~~最近已经进入了图论算法的学习。已经把单源节点的最短路径算法给看了一遍,并且也做了相应的题。刚刚随便翻了翻我们学习ACM图论算法培训的资料,还有很多要学得呀。。。SPFA,最大流,。。反正好多。慢慢学吧。刚好五一几天。努力去搞吧,弄完图论还有DP呢。最近看了我们学校推免加分规则,校ACM竞赛也能3等奖都能加0.5分。2等能加1分呢。。我觉得自己拿2等应该没问题,加油吧!!好好准备下~呼呼~ 阅读全文
posted @ 2012-04-29 00:58 Jason Damon 阅读(193) 评论(0) 推荐(0) 编辑
摘要:http://www.cppblog.com/mythit/archive/2009/04/19/80470.html (有入门例题)http://blog.csdn.net/moxiaomomo/article/details/5977281http://cuitianyi.com/blog/%e6%b1%82%e6%9c%80%e5%a4%a7%e6%b5%81%e7%9a%84%e4%bd%bf%e7%94%a8%e8%b7%9d%e7%a6%bb%e6%a0%87%e5%8f%b7%e7%9a%84%e6%9c%80%e7%9f%ad%e5%a2%9e%e5%b9%bf%e8%b7%a 阅读全文
posted @ 2012-04-29 00:50 Jason Damon 阅读(167) 评论(0) 推荐(0) 编辑
摘要:很裸的一道topo_sort题目,题目说,每组数据都会至少有一中排序,所以就不用考虑其它问题了。在这回顾下naive拓扑排序吧。 1.存储节点间的关系; 2.记录每个节点的入度; 3.循环N次,每次得到一个输出,每次循环里都要寻找入度为零的点,并且把它对应的节点的入度减一; 4.直到没有入度为零的点,则结束。#include <iostream>#include <fstream>using namespace std;#define MAXN 105bool adj[MAXN][MAXN];int in_degree[MAXN];int n;int result[MA 阅读全文
posted @ 2012-04-28 12:14 Jason Damon 阅读(2285) 评论(0) 推荐(0) 编辑
摘要:根据题目的要求,我们要每输入一次就要进行一次topo_sort。这样才能做到不成功时,能知道是哪步不成功,并且给出输出。还有要注意的就是如果我们可以提前判断结果了,但后面还有输入没完成,那么我们必须继续完成输入,不然剩下的输入会影响下一次case的输入。 这是我的第一道topo_sort的题目。发现naive topo_sort的算法不好理解啊,看了好多代码都没弄懂。。。最后看了joy_的这篇文章,才彻底的弄懂了。我都是参考他的代码来写的。再次谢谢他。加油加油,多做几题就会更熟练了。#include <iostream>#include <fstream>using n 阅读全文
posted @ 2012-04-28 00:24 Jason Damon 阅读(753) 评论(0) 推荐(0) 编辑
摘要:先把题目给的数据转换为一个完全图(边数位n(n-1)/2)。然后求最小生成树就OK啦~ 哎。把改用find_set的地方我用了father,浪费了我起码半个小时的时间去调试。。。呜呜。。。不过也没事,这次算彻底把并查集给学会了!!!绝对不能再忘了。 这题是用并查集做的,并查集简单,kruskal的naive方法懒得去看。。待日后有空再看看吧。有这个并查集用起来绝对还不错吧。就是效率没那么高而已。#include <iostream>#include <fstream>#include <string>#include <algorithm>usi 阅读全文
posted @ 2012-04-26 21:54 Jason Damon 阅读(367) 评论(0) 推荐(0) 编辑
摘要:这题也是求正权回路的,但和之前那题用Bellman-ford的不一样,因为这个是不知道源点的。所以用Floyd可以求出所有节点的最短路径,然后判断a[i][i]是否大于1即可。反之,如果知道了确定的源节点,那么我们用Bellman-ford的话会更方便。具体他们的区别,请看这里。//Floyd#include <iostream>#include <fstream>#include <map>#include <string>using namespace std;#define LEN 35#define INF 10000double a[L 阅读全文
posted @ 2012-04-24 21:16 Jason Damon 阅读(380) 评论(0) 推荐(0) 编辑
摘要:这是求所有节点间最短路径的题。果断用floyd,三个for循环就OK!如果不懂floyd,请看这里。题意有点绕。。。我不知道怎么描述,看了discuss里面有个人的解释,非常好。请看下面:释疑:- 一个人可以同时给几个人发送消息- 结束状态必须是所有人都受到了消息思路:1. 通过Stockbrokers(SB?)i发消息,所有人同时收到所花时间 (可以是无穷哦~)2. 找出第一步所得结果中的值最小的那一个3. 如果第二步所得结果为无穷,说明此图不可联通~#include <iostream>#include <fstream>using namespace std;#d 阅读全文
posted @ 2012-04-24 11:53 Jason Damon 阅读(1108) 评论(0) 推荐(0) 编辑
摘要:这题是个简单的Dijkstra问题。关键是在输入。我的那个输入方法是看discuss别人给出的。如不用这个的话我们可以把字符串转换为数字。还有就是它题目要求的是到所有节点d的最短路径中最大的那个cost!#include <iostream>#include <fstream>using namespace std;#define LEN 101#define INF (1<<30)#define MAX(a,b) (a>b?a:b)int n,dist[LEN];int map[LEN][LEN],maxcost;bool v[LEN];void D 阅读全文
posted @ 2012-04-22 22:36 Jason Damon 阅读(218) 评论(0) 推荐(0) 编辑
摘要:这是我的第一题dijkstra,开始我还是不会把题目的要求转换为要实际的模型,还是看了mengxm的这篇题解,才有了真正的认识,而且他的代码非常简洁,看起来很舒服,学习了!在此次谢谢他。 这题的关键是要有等级的限制,即不能超过等级限制的范围,因此在这里我们可以用一个abs(a-b)<=m来判断是否超出范围,超出了就不考虑了。边的权值就是优惠的值,而最后要求的min_cost则是所有边的和加上最后一个节点的值。其它的就直接套Dijkstra算法就OK了~ 呼呼~#include <iostream>#include <fstream>using namespace 阅读全文
posted @ 2012-04-22 17:39 Jason Damon 阅读(729) 评论(0) 推荐(0) 编辑
摘要:这题是用bellman-ford求负权回路的问题。数组一定要开5100以上,不然会RE。这是我写的第二题Bellman-ford,写得很顺手了。加油加油~#include <iostream>#include <fstream>using namespace std;#define MAX 5100#define FAR 10001int k,n; //k为边数 n为顶点数int dist[MAX];struct node{ int start,end; int weight;}edge[MAX];bool Bellman_ford(){ int s,e,t; in.. 阅读全文
posted @ 2012-04-21 16:13 Jason Damon 阅读(311) 评论(0) 推荐(0) 编辑
摘要:本题用beffman-ford的思想,来求正环回路,一般是用来求负环回路的,但这里只要把比较大小符号转换一下就行了,反正两个都说明图不是收敛的。因为这是第一次做 beffman-ford的题。主要参考了http://blog.sina.com.cn/s/blog_6635898a0100kxu2.html。谢谢他。 加油吧,孩子,不断进步!!#include <iostream>#include <fstream> using namespace std;#define MAX 201int n,m,nums; //n货币种类,m汇率站点数,s Nick手中的货币种类d 阅读全文
posted @ 2012-04-21 00:54 Jason Damon 阅读(327) 评论(0) 推荐(0) 编辑
摘要:摘自百度百科 Bellman-ford算法是求含负权图的单源最短路径算法,效率很低,但代码很容易写。即进行不停地松弛(relaxation),每次松弛把每条边都更新一下,若n-1次松弛后还能更新,则说明图中有负环(即负权回路,本文最后有解释),无法得出结果,否则就成功完成。Bellman-ford... 阅读全文
posted @ 2012-04-21 00:45 Jason Damon 阅读(6541) 评论(0) 推荐(0) 编辑
摘要:我的思路: 先把每个数的出现的次数和下标记录,所以用到一个数据结构Node{num,points}。然后先根据points值排序,那么node[0].points就是最大值,然后我们就可以得到第二大的值,和他的位置,然后再把第二大的值的num排序一下,就可以输出了。因为我不想用那么多次for循环,所以用了两次排序。其实这题也可以用三次for来求出,但事先要先求出最大值和第二的的值。我比较了下,简单的for和我的这种方法,我的是150+ms,那个是200ms。 还是快一点点的,哈哈#include <iostream>#include <cstdlib>#include 阅读全文
posted @ 2012-04-20 13:02 Jason Damon 阅读(1589) 评论(1) 推荐(0) 编辑
摘要:转自:http://www.sunhongfeng.com/2011/07/%E5%8D%95%E8%B0%83%E9%98%9F%E5%88%97-poj2823/ 他的分析非常到位,顺便把单调队列给学了。很好,所以转了他的这篇文章。程序是我后来理解之后自己写的。看这个问题:An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving from the very left of the array to the very right. You can only se. 阅读全文
posted @ 2012-04-19 21:33 Jason Damon 阅读(8477) 评论(3) 推荐(0) 编辑
摘要:对于堆的数据结构的介绍,在网上搜了下,具体讲的不是很多。发现比较好的一篇介绍堆的博客是http://dongxicheng.org/structure/heap/。在此感谢他。通过对上面那篇博客的学习,然后自己也去翻了下《算法导论》里面关于堆排序(heapsort)的介绍。这样就对堆有了更加深刻的认识,在此,我结合自己的一点点理解,主要还是基于上面那篇博客的内容(主要也是《算法导论》里的内容),也把他里面程序的一些错误改正,我把这篇博客写了出来,以加深对堆的认识,并供自己日后温习。后面我还要练习poj上几天关于堆的题目,链接会在后面给出。1.堆 堆数据结构是一种数组对象,它可以被视为一科完全. 阅读全文
posted @ 2012-04-18 00:00 Jason Damon 阅读(43213) 评论(2) 推荐(5) 编辑
摘要:再次做并查的题目。本题用kruskar方法做。我开始没有按秩(即所包含的层数)来union_set结果WA,后来改了之后就AC了。为什么呢??不管,以后记得要加上按秩来合并吧。 这题有个技巧就是只用输入上半个矩阵就OK了,因为是对称的。看别人用prim方法做也挺简单的,接下来来学习一下prim算法吧。 kruskar:#include <iostream>#include <fstream>#include <algorithm>using namespace std;#define MAX 101int father[MAX];int rank[MAX]; 阅读全文
posted @ 2012-04-17 12:11 Jason Damon 阅读(357) 评论(0) 推荐(0) 编辑
摘要:参考:http://blog.csdn.net/lyy289065406/article/details/6647445 http://www.slyar.com/blog/poj-2513-c.html(谢谢他们) 这题主要是会把问题给转换为求Euler回路,即一笔画成并且不重复,反正我是想不到这点。把所有的端点当成顶点,木棍当成回路。这样就可以用判断是否能构成Euler回路来判断是否能连成一条直线。而判断是否能构成欧拉回路主要是根据它的两条性质:1.图是连通的;2.奇数节点的个数为0或者2。 对于判断图是否是连通的,我们可以用并查集来判断,如果是连通的,那么所有节点的fahter节点都应. 阅读全文
posted @ 2012-04-16 12:02 Jason Damon 阅读(354) 评论(0) 推荐(0) 编辑
摘要:学了Trie树(学习Trie树相关的内容,猛搓这!),来做这题,感觉挺简单的,边输入边判断是否存在是否有前缀(prefix),这样的话要考虑两种情况,一种是前面的某个串是该串的前缀,或者该串是前面某个串的前缀。 写完,提交,TLE!!原来不能用动态建树的方法,必须用静态树! 后来再提交,WA。。。哎。纠结死我了。跟别人的对比了下,觉得自己的也没错啊...真不知道错在哪了。下面贴出代码,求大牛指导! 最后看了discuss里面前辈给出的程序,把自己的改了下,是先排序,然后再Insert,这样可以少考虑一种情况。然后再把静态树的数组开大点,不然还是会WA的!最后终于AC了。AC代码:#inclu. 阅读全文
posted @ 2012-04-15 22:03 Jason Damon 阅读(1717) 评论(0) 推荐(0) 编辑
摘要:今天把Trie树彻底的看了下。发现网上有两篇非常好的文章,通过他们的博客,我对Trie树有了大题的了解。并且通过理解 消化 综合他们的知识,再结合我自己的编程爱好,我也把具体的程序实现了一遍,这样能对Trie树有更加深刻的认识!他们是:勇幸|Thinking 和 Maik。感谢他们。下面的分析也是从他们的博客摘抄以便理解的。Trie原理Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。Trie性质好多人说trie的根节点不包含任何字符信息,我所习惯的trie根节点却是包含信息的,而且认为这样也方便,下面说一下它的性质1.字符的种数决定每个节点的出.. 阅读全文
posted @ 2012-04-15 12:21 Jason Damon 阅读(7911) 评论(2) 推荐(0) 编辑
摘要:解题思路:转自:http://blog.csdn.net/lyy289065406/article/details/6647423 分析得非常好!!利用Huffman思想,要使总费用最小,那么每次只选取最小长度的两块木板相加,再把这些“和”累加到总费用中即可本题虽然利用了Huffman思想,但是直接用HuffmanTree做会超时,可以用优先队列做因为朴素的HuffmanTree思想是:(1)先把输入的所有元素升序排序,再选取最小的两个元素,把他们的和值累加到总费用(2)把这两个最小元素出队,他们的和值入队,重新排列所有元素,重复(1),直至队列中元素个数<=1,则累计的费用就是最小费用 阅读全文
posted @ 2012-04-14 23:14 Jason Damon 阅读(979) 评论(0) 推荐(0) 编辑
摘要:看到别人写的,觉得比较经典,存下来。语言是基础, 算法是灵魂, 思维是资本, 经验使历史。 做人做事交朋友是根本 阅读全文
posted @ 2012-04-14 23:06 Jason Damon 阅读(224) 评论(0) 推荐(0) 编辑
摘要:现在大三了,很多同学都开始找实习工作了。忙着去面试。偶然看到这篇文章,觉得讲得不错,就转发了。转自:http://topic.csdn.net/u/20091007/14/704a89ee-dc71-4e85-b0b0-92fb4ec44dcf.html做过无数笔试题,做过无数面试题,基本上没遇到过很重视语言细节的语言本身方面,可能会问问虚函数和多态,重载,作用域,存储方式,字节对齐,一般问的不多,或者根本不问相反,对待你不懂XX语言上,往往表现的相当宽容,我面试时坦言自己只会一点C,对方也表示没有关系,而我目标职位没有一个跟C是有点关系的比较重要的是,基本数据结构和算法,大规模数据处理技巧, 阅读全文
posted @ 2012-04-14 23:00 Jason Damon 阅读(252) 评论(0) 推荐(0) 编辑
摘要:这题和poj2299是一样的。而且测试数据还没那么强。当刷题吧~#include <iostream>#include <fstream>using namespace std;int a[1005],t[1005]; //t[]为暂存数组int cnt;void Merge(int l,int m,int r){ int i=l,j=m+1,k=0; while(i<=m && j<=r) { if(a[i]>a[j]) { cnt+=m-i+1; //a[j]是i以及i后面的逆序数 t[k++]... 阅读全文
posted @ 2012-04-14 16:00 Jason Damon 阅读(236) 评论(0) 推荐(0) 编辑
摘要:时间复杂度O(nlog2n)归并排序:void Merge(int l,int mid,int r){ int i=l,j=mid+1,k=0; while(i<=mid && j<=r) { if(a[i]>a[j]) { t[k++]=a[j++]; cnt+=mid-i+1; } else { t[k++]=a[i++]; } } while(i<=mid) t[k++]=a[i++]; while(j<=r) t[k++]=a[j++]; //将归并完成的结果复制到原数组中 for(i=0; i<k; i++) { a[l+i]=t[ 阅读全文
posted @ 2012-04-14 01:00 Jason Damon 阅读(338) 评论(0) 推荐(0) 编辑
摘要:陷阱啊!一开始我用冒泡排序(Bubble Sort)来统计。。晕,TLE。each case 50w.而一趟冒泡排序需要进行的是n-1,n-2,……,2,1,0的和次比较。即n*(n-1)/2次。总的时间复杂度为O(n^2).肯定是吃不消的。 于是,可以用归并排序来求它的逆序数,逆序即为它总共需要变换的次数。这样时间复杂度是nlog2n,而空间复杂度2n。利用归并求逆序关键是对子序列s1和s2在归并时(s1,s2已经排好序),若s1[i]>s2[j](逆序状况),则逆序数加上s1.length-i,因为s1中i后面的数字对于s2[j]都是逆序的。参考:http://www.slyar.c 阅读全文
posted @ 2012-04-14 00:54 Jason Damon 阅读(514) 评论(0) 推荐(0) 编辑
摘要:纯纯的水题。#include <iostream>#include <fstream>#include <cstdlib>using namespace std;int a[1000005];int cmp(const void*a,const void*b){ return *(int*)a-*(int*)b;}int main(){ int n,i; freopen("acm.txt","r",stdin); scanf("%d",&n); for(i=0; i<n; i++) s 阅读全文
posted @ 2012-04-13 21:59 Jason Damon 阅读(163) 评论(0) 推荐(0) 编辑
摘要:非常简单的逆序数+排序。这里对sort和qsort彻底的弄明白了。sort是c++里面的,要包含algorithm头文件,cmp函数要返回bool值。 qsort是包含在stdlib.h这个头文件里面,cmp函数比较特殊cmp(const void*a,const void *b),一般返回int. 我用两个函数来提交了下,sort要比qsort快点呀。#include <iostream>#include <cstdlib>#include <algorithm>using namespace std;struct Node{ int rank; char 阅读全文
posted @ 2012-04-13 21:29 Jason Damon 阅读(270) 评论(0) 推荐(0) 编辑
摘要:直接循环肯定TLM。于是,分成左右两部分,前三个一个部分。分别算出他们的所有值,并存入hash[]数组中。hash数组要开50^5*2.因为可能存在求值是负的,但数组不能是负的,所以要开两倍,并且算出的结果要加上31250000再hash. 一开始我用二分查找。发现有点麻烦,而且也没hash快,下次用二分查找的时候,一定要优先考虑是不是可以用hash呢。二分查找的话要:50^3+50^2*log50^3.如果用hash的话:50^3+50^2。明显比二分查找要快。hash是个好东西啊!把查找变成线性的了!非常好。 我写的这个程序我跟别人的比较了下,都基本一样。但是多了memset()函数,完. 阅读全文
posted @ 2012-04-12 23:45 Jason Damon 阅读(294) 评论(0) 推荐(0) 编辑
摘要:据说这题很经典噢~开始的分析也经典。题目的分析我就不多说了,具体可以参考:http://blog.csdn.net/chinaczy/article/details/5790107一看就很清楚了(感谢这位博主)。但他用的hash函数我暂时是不能理解,说以没用它的方法。自己写了个简单的hash方法,似乎还挺凑效,然后再处理冲突。一开始时,我是先hash一边,然后再来个for循环来判断每个hash值....TLE。不行啊,然后换了个方法,hash和找最大值同步进行,这样就省去了最后的一次遍历,很能节省时间。还有就是要注意前导的全零,没有的话就WA.我就错了好多次,后来看了discuss才明白的,. 阅读全文
posted @ 2012-04-11 17:46 Jason Damon 阅读(483) 评论(0) 推荐(0) 编辑
摘要:转自:http://blog.jobbole.com/471/编者按:原文作者Alan Skorkin是一名软件开发人员,他在博客中分享对软件开发相关的心得,其中有很多优秀的文章,本文是其中的另一篇。Alan认为:阅读优秀代码是提高开发人员修为的一种捷径。以下是全文。我突然想起来,很多程序员都讨厌阅读代码。来吧,承认吧! 每个人都喜欢编写代码,编代码是件趣事。 另一方面,阅读代码也不容易。 不仅不容易(编注:参见《微软资深软件工程师:阅读代码不容易》),而且还非常枯燥,咱们要面对这一事实。任何不是你的代码都不怎样。(虽然我们没有说出来,但我们都是这样想的。)即便是你自己几个小时之前写的代码,也 阅读全文
posted @ 2012-04-10 21:27 Jason Damon 阅读(200) 评论(0) 推荐(0) 编辑
摘要:Lempel_Ziv_Welch(LZW)算法利用了一种自适应的,基于字典的压缩技术。LZW编码器在接收数据时动态地创建字典。LZW在实现过程中不断将越来越长的重复条目插入字典中,然后将字符串的编码而不是字符串本身发送出去。 根据书上的伪代码(Pseudo code),也能很快的把程序写出。到此,多媒体第一次作业的四个算法都完成了。又可以有时间去刷题和搞搞java了。hiahiahia。。。。加油哦~孩子#include <iostream>#include <fstream>#include <string>using namespace std;stru 阅读全文
posted @ 2012-04-10 21:05 Jason Damon 阅读(1891) 评论(0) 推荐(0) 编辑
摘要:算术编码是一种更现代的编码,在实际中比Huffman编码更有效。算术编码把整个消息看做一个单元。具体的实现也很方便。根据书上的伪代码,很快就能把程序写出来。下面是我写的程序。#include <iostream>#include <fstream>#include <string>#include <queue>#include <math.h>using namespace std;typedef struct{ char symbol; float range,low,high;}Team; Team in[100];float 阅读全文
posted @ 2012-04-09 23:45 Jason Damon 阅读(1133) 评论(0) 推荐(0) 编辑
摘要:有好几天没发表文章了。主要是这几天在搞多媒体的压缩算法。老师布置了四个算法(Huffman编码,自适应Huffman编码,算术编码,LZW编码算法),因为Huffman算法以前就实现过了,直接用上就OK。但是自适应Huffman我弄了好久,整整两天吧,也是断断续续的,因为这个周末我们有微机的课设,两天都呆在实验室了。我写这基本谈不上什么算法,只能说是勉强完成了基本功能,如果是在POJ上面的话。肯定是TLE。没办法,我实在不知道怎么写了额。凑合着吧,接下来还要完成剩下的两个算法。再接再励吧。加油。然后才能继续我的ACM刷题了。Huffman://HuffmanTree#include<st 阅读全文
posted @ 2012-04-09 21:38 Jason Damon 阅读(2594) 评论(0) 推荐(0) 编辑
摘要:很简单的hash题。 除留余数法。处理冲突的方法我用的是链表法。做得很顺利。一次性通过。哈哈~#include <iostream>#include <fstream>#include <memory.h>using namespace std;#define prime 50021int a[7];struct hash{ bool used; int arm[6]; hash* next; hash(){used=false; next=NULL;}}Hash[100001];int main(){ int n,i,j,sum; bool fo... 阅读全文
posted @ 2012-04-04 18:13 Jason Damon 阅读(255) 评论(0) 推荐(0) 编辑
摘要:3月25日-4月4日这段时间里。我把字符串的一些基本操作和算法学了下。主要有串的基本操作,字符串的hash函数(Rabin-Karp,ELFhash),还有KMP算法。总体感觉还是不错的。尤其清明这三天没出去,都呆在宿舍了,虽说效率可能没平时高,但还是学到了很多东西。掌握得也不错。不错RK和ELFhash要多看。因为这两个算法如果不常用的话很容易就给忘记了。过后还要好好的看一下。 接下来的 -----,我要完成对数的hash,trie树,排序,优先队列的学习。加油! 阅读全文
posted @ 2012-04-04 16:21 Jason Damon 阅读(222) 评论(0) 推荐(0) 编辑
摘要:统计前缀后缀相等的个数,包括自身,从小到大输出。可以通过next[]向前统计。因为每一个next[i]都指向该串前部字串(p0p1..pk-1)与i之前字串相等(pi-k+1...pi-2pi-1)的最大字串,只要再向前统计字串的匹配个数,即可得到更小的匹配情况。 还有,开大的数组的话,不能子main()里面开,会stack overflow in main.ext.#include <iostream>#include <fstream>#include <string.h>using namespace std;int next[400001],a[40 阅读全文
posted @ 2012-04-04 13:01 Jason Damon 阅读(258) 评论(0) 推荐(0) 编辑
摘要:记住KMP是多计算一位的。其中next[i]为不为自身的最大首尾重复子串长度。 位移j=i-next[i]可以看作是构成字符串s的字串(如果i%j==0,存在这样的构成),相应的重复次数也就是n/d。 a b c d *next:-1 0 0 0 0 这时j=i-next[i]; 结果是j==i;于是得到i/j=1. a b c a *next:-1 0 0 0 1 这时j=i-next[i]; 结果是i%j!=0.但是结果还是1。所以这题要考虑如果i%j!=0时也要输出1.即自身。这只是字串等于自身的一种情况。上面的那种情况也是一种#include <iostream>#incl 阅读全文
posted @ 2012-04-04 11:24 Jason Damon 阅读(206) 评论(0) 推荐(0) 编辑
摘要:这题可以加深对KMP的理解! 题意:给出一个字符串,对于它的每个(each)前缀(prefix)长度 i(2<=i),求能由一个子串构成这个前缀的最大字串数目。看例子比较清楚些吧。我是看别人的才知道的。具体看以参考:http://jovesky.info/blog/2011/08/25/poj-1961-period-c-language-version/例子:字符串为aabaabaabaab前2位也就是aa是a重复2次前6位也就是aabaab是aab重复2次前9位也就是aabaabaab是aab重复3次前12位也就是aabaabaabaab是aab重复4次解题思路:通过KMP的get_ 阅读全文
posted @ 2012-04-04 01:00 Jason Damon 阅读(210) 评论(0) 推荐(0) 编辑
摘要:没看明白时,觉得很难。弄清楚后其实很简单。虽然说以前学了,但这么久不看了,这次再看时,花了好长时间。。。。一定要给记住了噢。下面我只给出了代码的实现。如果想看详细的话。请移步:http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/kmpen.htm英文的。讲得很好还有就是http://www.slyar.com/blog/kmp.html这位前辈的分析很好啊!他才比我大一届。但看了他的博客,很佩服他。向他看齐吧!看不懂就自己去翻翻数据结构的数吧。 关键在于get_next://Preprocessing algorithmvoid km 阅读全文
posted @ 2012-04-03 22:45 Jason Damon 阅读(207) 评论(0) 推荐(0) 编辑
摘要:上午我用了Rabin-Karp算法做的。基本的数据可以测试通过,但是一提交就WA。偶滴天啊,我不知道错在哪啊。。我是非专业的。。呜呜。找了半天找不出。算了。看人家都是用KMP做的,那我下午就用KMP写一个吧。一定把它拿下!!哼哼 Rabin-Karp:#include <iostream>#include <fstream>#include <math.h>#include <string.h>using namespace std;#define M 16381*4733+1int nCount;void Rabin_Karp(char*T,c 阅读全文
posted @ 2012-04-03 12:32 Jason Damon 阅读(218) 评论(0) 推荐(0) 编辑
摘要:再次我推荐touzani的专栏的那篇文章。虽然说和算法导论上面的是一样的,但是我还是没心情看那本黑书,密密麻麻的都是字,还是看网上的爽点。 下面我摘抄点重点的部分来帮助理解吧。其中的h = d m-1 (mod q)但是加入模q后,由ts ≡ p (mod q)不能说明 ts = p.但ts � p (mod q), 可以说明 ts ≠ p,因此当ts ≡ p (mod q)时, 再用朴素的字符串匹配算法验证ts = p。.如果q足够大,可以期望伪命中很少出现。算法RABIN-KARP-MATCHER(T, P, d, q)1 n ← length[T] 2 m ← length[P] 3 . 阅读全文
posted @ 2012-04-03 12:29 Jason Damon 阅读(331) 评论(0) 推荐(0) 编辑
摘要:方法一: qsort+二分查找。先对字典根据外语来进行qsort.然后通过二分查找即可找到匹配的项。这里用到两个函数sscanf()和bsearch();#include <iostream>#include <fstream>#include <string>using namespace std;char str1[11],str2[11];char str[25];struct dict{ char en[11]; char fn[11];}a[100005];int q_cmp(const void*a,const void*b) { return 阅读全文
posted @ 2012-04-02 19:44 Jason Damon 阅读(1967) 评论(0) 推荐(0) 编辑
摘要:百度,google了很多关于这个函数的用法。都大同小异,都只是给出了代码,我觉得对我这个初学者来说有点难理解。所以,在这,我综合一下我搜到的知识,把它再加深下印象吧。 ELFhash函数关键是要取得字符串对应的hash值。(别人的分析:它对于长字符串和短字符串都很有效,字符串中每个字符都有同样的作用,它巧妙地对字符的ASCII编码值进行计算,ELFhash函数对于能够比较均匀地把字符串分布在散列表中。这些函数使用位运算使得每一个字符都对最后的函数值产生影响。) ELFhash():参考http://blog.chinaunix.net/uid-24683784-id-3061386.html. 阅读全文
posted @ 2012-04-02 19:38 Jason Damon 阅读(7750) 评论(0) 推荐(1) 编辑

点击右上角即可分享
微信分享提示