摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1425http://acm.hdu.edu.cn/showproblem.php?pid=1425View Code #include <iostream>#include <stdio.h>using namespace std;long heap[1000005];//觉得那个数有点大所以开了长整型void adjust(long start,long n){ long i; long temp;//用来记录当前要交换的值 temp = heap[start]; for( 阅读全文
posted @ 2012-07-21 14:37 某某。 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 堆排序堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。 (1)用大根堆排序的基本思想 ① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区 ② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key ③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]... 阅读全文
posted @ 2012-07-21 14:29 某某。 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 这道题我就不解释了,无非就是枚举取字串,然后kmp进行比较。本来不大想贴着道题的。但是我很悲剧的是为了省事直接在上一道KMP上贴的代码,然后用了一个memset函数,我的pre数组开刀了一百万= =。不过还是比较值得的,花了时间不少但是还是知道了memset是需要花费时间的。View Code #include <iostream>#include <stdio.h>#include <string.h>using namespace std;int pre[100];void predeal(char s[]){ int len,i,j; len = st 阅读全文
posted @ 2012-07-20 19:13 某某。 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 原网址http://www.matrix67.com/blog/archives/115如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段。我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法。KMP算法是拿来处理字符串匹配的。换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串)。比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串。你可以委婉地问你的MM:“假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?”解决这类问题,通常我 阅读全文
posted @ 2012-07-20 14:23 某某。 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 题目http://poj.org/problem?id=2406/*一开始不大理解,写了个笨方法,就是从s[0]开始找。因为一定是从s[0]开始的子串只要len==len1*count 就直接输出,后来发现tle /* memset(s1,0,sizeof(s1)); for(i = 0;i < len;i++) { s1[i] = s2[i]; predeal(s1); for(i = 0;s2[i] != '\0';i++) printf("%d ",pre... 阅读全文
posted @ 2012-07-20 13:14 某某。 阅读(273) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=3461纯KMP不多说上代码= =。。View Code #include <iostream>#include <stdio.h>#include <string.h>using namespace std;int pre[10005];void predeal(char s[]){ int len,i,j; len = strlen(s); pre[0] = -1; j = -1; for(i = 1;i < len;i++) { while(j > -1 && s[j+1] 阅读全文
posted @ 2012-07-20 12:32 某某。 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 连接:目前uva挂掉了~= =。。。大意是给你N个字符串,每个串的第一个单词代表国家,后面的单词表示女人,要你找出每个国家出现了几个女女。按字字典书序输出。一开始re,发现数组开小了。后来wa很郁闷,最后发现没有删除中间测试数据的输出= =。。。以下是代码View Code #include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct node{ char con[205]; char girl[205]; int num;}wokao;int cmp_string(wokao *a, 阅读全文
posted @ 2012-07-18 18:32 某某。 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 从昨天晚上到今天上午一直再rererererererererererererere,最后中午闲着没事在uva上用c++交了一边,结果是= =。。。AC泪奔inghttp://poj.org/problem?id=1001这道题在poj上和uva上不大一样 uva结果是0的时候输出.,poj要输出0View Code #include<stdio.h>#include<string.h>#include<stdlib.h>int a[2005],b[2005],res[2005];int multiply(int n,int len){ int k,max,j 阅读全文
posted @ 2012-07-18 14:54 某某。 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 题目连接 :http://poj.org/problem?id=2524题目大意。已知有n个大学生,其中有m对宗教信仰相同的学生,请你估算这n个学生中最多有多少种宗教信仰。不多说直接上代码~View Code #include<stdio.h>int set[50005];int find(int x){ int r = x; while(set[r] != r) { r = set[r]; } return r;}void merge(int a,int b){ a = find(a); b = find(b); if(a == ... 阅读全文
posted @ 2012-07-17 14:13 某某。 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1272本人若菜,最近做题的时候遇见了这个所以才开始接触并查集。用并查集来检查连通性也就是检查最小生成树。最小生成树的点减去边的差值为一,且在同一个集合内。因此,判断条件有二:一没有产生回路,二点数减去边数为1;可以得到如下代码我们用t来储存点数与边数之差,当产生一条非回路的时候t--,出现一个点t++;while(scanf("%d %d",&a,&b)&&a||b) { if(merge(a,b) == 0)//是已经一个属于同一个集合,也就是说 阅读全文
posted @ 2012-07-17 11:30 某某。 阅读(426) 评论(0) 推荐(0) 编辑