2012年3月12日
摘要: 首先给出一个模式串 ss[], 然后给出一个主串 s[]。然后让你求 模式串在主串中出现的次数。kmp模板题:一通则百通#include<stdio.h>#include<string.h>char ss[100000],s[1000000]; //ss是模式串, s是主串 int next[100000];int cnt;void getnext(int y){int i=0,j=-1;next[0]=-1;while(i<y){ if(j==-1||ss[i]==ss[j]) { i++; j++; if(ss[i]==ss[j]) next[i]=next[ 阅读全文
posted @ 2012-03-12 07:33 hrbust_09zhangyabin 阅读(150) 评论(0) 推荐(0) 编辑
  2012年3月10日
摘要: 一次AC,受宠若惊啊!呵呵,一看数据1<=n<=10000000,感觉有点大,很担心超时。题目要求求出最大集合的元素个数。思想是并查集,不会错。有人用了压缩路径的方法,我估计他也是怕在最后遍历时,求元素的根超时。我不太熟悉压缩路径,就在另设置了一个数组root[10000000], 用来存储以 i 为根的集合的元素个数。这样一来,在每次合并两棵树时,将两棵数的集合元素个数相加存放在 root[i]中。并设置全局变量 max,每次将新树的元素个数与 max 比大小。 最后输出 max 即为结果。 342AC代码:#include<stdio.h>int set[10000 阅读全文
posted @ 2012-03-10 12:27 hrbust_09zhangyabin 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 题目大意:Hopper教授正在研究一种稀有虫子的交配行为。他假设它们有两种性别并且它们只与异性交配。在他的实验中,很容易识别虫子和它们的交配行为,因为虫子背后印有编号。问题给定一组虫子的交配行为,确定实验是支持教授的假设即虫子没有同性恋,还是有部分交配行为不符合假设。这道题实际上还是并查集,和以往不同的是。以往给出两个元素的关系,然后认为这两个元素有联系,把它们划归为同一个集合。 最后看看能划分出多少个不同的集合。本道题,可以认为有两个集合,异性和同性。给出关系,希望你检查这两个集合有没有连接,即有没有同性恋。大体思路: ‘合并’操作, ‘查找’操作不变。设置一个sex[] 数组,sex[i] 阅读全文
posted @ 2012-03-10 10:58 hrbust_09zhangyabin 阅读(797) 评论(0) 推荐(0) 编辑
  2012年3月9日
摘要: 这道题给出了一些点和边的信息,让你判断是否能够组成一个无环的联通集合,且这个唯一的集合可以为空。你需要做:1,判是否成环, 只要输入的边的两个点有共同的父节点,那么着两个点就成环了。2,判联通,只要最后判断根节点的总数为1即可。这道题花了我一上午,WA了5次。前两次是我不知道判联通,该! 后几次是太粗心了,初始化该写100000,却写成了10000! 累死我了,怎么也找不出原因!唉,悲剧啊注意若只输入0 0,则输出YesAC代码:#include<stdio.h>int set[100005];int flag[100005];int temp;int find(int x){in 阅读全文
posted @ 2012-03-09 13:56 hrbust_09zhangyabin 阅读(227) 评论(0) 推荐(0) 编辑
  2012年3月8日
摘要: 这道题和上一道很类似。第一道会了,第二道很快就AC了!不同的是,上一道是找有多少个不相交集合。 求集合的数量。 这一道是求某个确定集合中的元素个数。不难,中间遇到的一个小麻烦,是因为对基础概念理解不深。http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1073AC代码:#include<stdio.h>int set[50005];int find(int x){int r;r=x;while(set[r]!=r)r=set[r];return r;}void merge 阅读全文
posted @ 2012-03-08 21:50 hrbust_09zhangyabin 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 题意:某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。 注意:两个城市之间可以有多条道路相通,也就是说3 31 21 22 1这种输入也是合法的当N为0时,输入结束,该用例不被处理。对每 阅读全文
posted @ 2012-03-08 21:45 hrbust_09zhangyabin 阅读(119) 评论(0) 推荐(0) 编辑
  2012年3月7日
摘要: 终于明白前一个八皇后为什么跑那么慢了,在递归上逻辑混乱。dfs(step)求的就是第step层,可以放置皇后的位置。而我刚刚又很贱的去for(i=1;i<=step;i++)重新求了一下第1行到第step行,已经排好的棋盘的合法性。 无语,当然是合法的了。 于是,理清思路,去掉一层循环。速度就上去了。汗,原来时间复杂度是0(n*n*n),现在是0(n*n)。唉,还是基础不牢固。AC代码:31ms#include<stdio.h>#include<string.h>int a[105][105]; //该位置没有皇后就是0, 有皇后为1 int n;int coun 阅读全文
posted @ 2012-03-07 14:14 hrbust_09zhangyabin 阅读(472) 评论(0) 推荐(0) 编辑
摘要: 今天上午用深搜算法敲了一个N皇后,什么剪枝都没有。算法很朴素,虽然运行良好。但耗时很久!贴别是当我看着它求解n=8时,整整用了3秒才递归出来。快笑死我了,用它来刷题,绝对废了~~~好吧,代码先放在这里,以后好好修改它!#include<stdio.h>#include<string.h>int a[105][105]; //该位置没有皇后就是0, 有皇后为1 int n;int count;int s[105]; //s[i]=j; i表示第i行,j表示第i行中,第j个位置有皇后void dfs(int step) //探索第step行皇后的位置 {int i,j,k; 阅读全文
posted @ 2012-03-07 12:12 hrbust_09zhangyabin 阅读(396) 评论(0) 推荐(0) 编辑
  2012年3月4日
摘要: 简单深搜。每次对第step个位置进行测试,for(i=2;i<=n;i++){ if(第i个点没有被访问过,并且和为质数) result[step]=i;//则将这个数放入step的位置visit[i]=1;//并且对第 i 个数进行标记,以后不再访问 dfs(step+1);//对下一个点按相同规则进行访问}我发现,深搜可以这样理解: 以某一个点为源点按确定的规则进行搜索。如果他的下一个邻接点可行(没有被访问过,且符合规则),则记录这个点,并标记。 然后,重新以该点为新的源点进行搜索。 如果不可行,则退回到上一步,继续按规则进行所示。直到满足结束条件。DFS即,每次一搜到底,不行就重新 阅读全文
posted @ 2012-03-04 11:30 hrbust_09zhangyabin 阅读(190) 评论(0) 推荐(0) 编辑
  2012年3月3日
摘要: 今天一上午都在处理以前遗留下来的问题。以前不会的,无从下手的一下子都AC 了!好爽啊这道题是个简单动规,和数塔类似。动态转移方程 d[i][j]=min(d[i-1][j], d[i][j-1]) + d[i][j];最后输出d[n][n]即可。AC代码:#include<stdio.h>#include<string.h>//int data[1002][1002];int d[1002][1002];int n;int main(){int i,j;while(scanf("%d",&n)!=EOF){memset(d,100,sizeo 阅读全文
posted @ 2012-03-03 09:59 hrbust_09zhangyabin 阅读(107) 评论(0) 推荐(0) 编辑