上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 18 下一页
摘要: http://poj.org/problem?id=3461 基础KMP,要注意一次查找完成后,到下一可查找处继续匹配,这样才能保证得到最终个数。code:#include<cstdio>#include<cstring>charsubstr[10001];charstr[1000001];intnext[10001];intsublen,len,ans;voidget_next(){next[1]=0;intj=0;for(inti=2;i<=sublen;i++){while(j>0&&substr[j+1]!=substr[i])j=n 阅读全文
posted @ 2012-02-05 17:06 追逐. 阅读(206) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2752 KMP的next数组应用。一句话,next[j]必须为满足str[1..next[j]] = str[j-next[j]+1..j]的最大值。 以abababa为例,next[7] = 5,则str[1..5] = str[3..7],显然str[3..5] = str[5..7]。 next[5] = 3,则 str[1..3] = str[3..5],根据上面所得可知str[1..3] = str[5..7]。 由于next数组的性质,显然上述对任意情况都是成立的,每个next保存的值都可使str[1..next[j]... 阅读全文
posted @ 2012-02-05 03:10 追逐. 阅读(176) 评论(0) 推荐(0) 编辑
摘要: poj2406 http://poj.org/problem?id=2406 给定一个字符串,问最多是多少个相同子串不重叠连接构成。 KMP的next数组应用。这里主要是如何判断是否有这样的子串,和子串的个数。 next数组的作用是在匹配无法进行下去时,可继续匹配的位置。这就要求next[j]必须为满足str[1..next[j]] = str[j-next[j]+1..j]的最大值。对于串的每一个前缀都取满足条件的最大值,则next[len]的值即为前一个子串的尾位置。 例如ababab,next[4]的值为2,即指向第一个b,因为str[1..2] = str[3..4],同理next[6 阅读全文
posted @ 2012-02-04 22:08 追逐. 阅读(340) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2912 枚举+关系并查集,并查集与1182相似,枚举每个小孩为judge时的情况,若当前枚举情况下每个round都是正确的,则当前枚举编号可能是judge。若只找到一个judge的可能,则找出排除其他编号所需最多的round数,两者即为输出。 做了一整天,WA了9次,原因是偏移量r公式搞错一个地方,列了好多次表才搞定。code:#include<cstdio>#include<cstring>usingnamespacestd;intf[501];intr[501];intx[2001];inty[2001];int 阅读全文
posted @ 2012-02-02 23:50 追逐. 阅读(271) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1182 重点依旧是用rank记录相对于根节点的关系,并及时跟新rank的值。code:#include<cstdio>usingnamespacestd;intf[50001];intr[50001];//与根节点的关系intfind_Set(intx){inttemp;if(x==f[x])returnx;temp=f[x];f[x]=find_Set(temp);r[x]=(r[temp]+r[x])%3;/*r[x]是相对于x原根节点temp的关系值,现在相对根节点已不是temp故更新r[x]值时要加上temp相对于其根节 阅读全文
posted @ 2012-02-01 00:30 追逐. 阅读(230) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2236 给定N个坏掉的无线发射器坐标,给定其能相连通的最大距离,O i 代表修好第i个发射器,S i j 表示判断第i个和第j个是否能接通(可间接相连)。 简单并查集应用,一个bool数组标记是否可用,每修好一个,找N个中已修好且可以直接相连的合并。最后判断i,j 是否都已修好且在同一个集合中即可。 脑残的错,把make_set()放到n的输入之前了,找了N久N久。泪流满面啊...code:#include<cstdio>intnode[1005][2];intp[1005];boolflag[1005];intn,d;void 阅读全文
posted @ 2012-01-31 02:22 追逐. 阅读(217) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1308 题意:给出一些节点的连接情况,问所给出的节点是不是可以构成一棵树。 树的定义已经给出: 1. 只有一个根节点 2. 根节点到每个节点只有唯一路径 3. 题目第一句特别提到空树也是一颗合法树 对于第一条,明显的森林不是树,并查集将每对输入合并,最后看是否在同一个集合中。 第二条,保证唯一路径与题目中给出的第二条定义相似,对于每个节点,只有一条边指向它。如果节点已经存在于集合中,则肯定已经有一边指向它,或者它是作为根节点。也就是说,输入的两个元素不能在同一个集合中。可恶的是这题居然没给数据量!开始以200为上限做的,最后用majia试了 阅读全文
posted @ 2012-01-31 00:34 追逐. 阅读(224) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1703 跟2492基本一样,不多说。code:#include<cstdio>usingnamespacestd;intf[100005];intr[100005];intn,m;intfind_Set(intx){inttemp;if(x==f[x]){returnx;}temp=f[x];f[x]=find_Set(temp);r[x]=(r[x]+r[temp])%2;//保持r[x]相对于根节点的稳定returnf[x];}voidUnion(intx,inty,intfx,intfy){f[fy]=fx;r[fy]=( 阅读全文
posted @ 2012-01-30 22:32 追逐. 阅读(173) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2524 依旧简单并查集,拿1611火速改了改火速提交,果断PE...把输出的最后一个空格放%d前面了,真活该不运行就交。 但是这题有个疑问,为什么按秩合并没有比直接合并快??code:#include<cstdio>intp[50005],r[50005];voidmake_set(intn){for(inti=0;i<n;i++){p[i]=i;r[i]=0;}}intfind_set(intx){if(x!=p[x])p[x]=find_set(p[x]);returnp[x];}voidunion_set(intx, 阅读全文
posted @ 2012-01-30 21:48 追逐. 阅读(183) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1611 简单入门并查集,以前已经做过,但是代码不太好。DP优化搞上火了,做做别的换换脑子... 以前代码Memory:356KTime:32MS#include<cstdio>usingnamespacestd;constintmaxn=30000;intfather[maxn+5];//记录父节点intlen[maxn+5];//记录以该点为根的集合元素的个数voidinit(intn){//并查集的初始化inti;for(i=0;i<n;i++){father[i]=i;len[i]=1;}}inlineintgetr 阅读全文
posted @ 2012-01-30 21:33 追逐. 阅读(183) 评论(0) 推荐(0) 编辑
上一页 1 ··· 6 7 8 9 10 11 12 13 14 ··· 18 下一页