
算法
文章平均质量分 68
纯属虚构
互联网后台开发大数据Linux
展开
-
并查集变形 - 敌人
给出一些敌人的队,如 a -b c -d a-c 给他们分成两组,那么以上就可以分为a,d一组,bc一组。但如果敌人关系是这样的: a-b c-d a-c b-c 则a-b-c两两为敌人,这样就分不成两组了。 现在就是给出这么一堆关系,让你判断是否可以分成两组。 如何应用并查集呢?思路就是,用一个数组记录敌人的关系,这样可以O(1)时间内找到敌人。 (1)初始化为-1 (原创 2013-09-29 23:18:36 · 1647 阅读 · 0 评论 -
并查集简单模板
并查集解决的问题很典型,就是等价类划分的问题。 三个函数: void init(int *p, int n) { for(int i=0; i<n; i++) p[i] = -1; } int Find(int x, int *pn) { if(pn[x]<0) return x; return pn[x] = Find(pn[x], pn); } // 合并:大的合原创 2013-09-29 21:38:33 · 738 阅读 · 0 评论 -
字符串循环移位 编程之美3.1
给定两个字符串s1和s2,要求判定s2能否能被s1做循环移位得到的字符串包含。例如,s1=AABCD,s2=CDAA,返回true,给定s1=ABCD,s2=ACBD,返回false。 思路1:找出所有循环移位,逐个进行字符串匹配。n*字符串匹配的复杂度。kmp可以做到线性,因此总的复杂度为n^2. 思路2:s1复制一下,变成s1s1,如s1=ABCD,变成ABCDABCD,用它进行匹原创 2013-10-04 12:47:51 · 1755 阅读 · 1 评论