随笔分类 -  数据结构

摘要:找某颗星的左下角有几颗星。输出有多少颗星左下角拥有0颗星,有多少颗左下角拥有1颗星……一直到n-1 。因为输入时是按y值是递增的,所以直接用x(x也是递增的)来构建树状数组,接下来其实就是统计x 前面有多少个比它少的数。树状数组参考:http://zxj015.blog.163.com/blog/static/170613730201136105251115/#include<iostream>#include<stdio.h>#include<stdlib.h>using namespace std;const int MAX = 32002;int n, 阅读全文
posted @ 2011-04-08 17:54 CoderZhuang 阅读(115) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2299给定一个整数数列,相邻之间的数可以互换,求最少要多少次互换后得到一个升序数列。本题说白了就是求解逆序对问题(关于逆序对请参考:http://baike.baidu.com/view/689576.htm),接下来便是用归并排序来解逆序对了。#include <stdio.h>#include <stdlib.h>#define MAX 500001int n, a[MAX], t[MAX];__int64 sum;void Merge(int l, int m, int r){ int p = 0; int i 阅读全文
posted @ 2011-04-07 11:33 CoderZhuang 阅读(126) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3321一棵树,开始时每个结点都有一个苹果,输入C x表示更新x结点,若x结点有苹果,把该结点苹果摘掉,若该节点无苹果,在该节点上增加一个新的苹果。输入Q x表示以该节点为根的子树有多少个苹果。伸手便该题主要问题是如何把一棵树转化为树状数组,之后便可以直接运用树状数组来求区间的和。转化的方法是用dfs深搜遍历树,每一个结点要做两次标记,第一次访问到时标记该结点,即为该结点在树状数组中的起始位置,第二次当dfs深搜返回时又一次标记,即为该结点在树状数组中末位置,始末位置之间即代表了以该结点为根的子树的所有结点。有关树状数组问题可以参考:http 阅读全文
posted @ 2011-04-06 23:34 CoderZhuang 阅读(131) 评论(0) 推荐(0)
摘要:在这里还是先转一篇较好的讲解学习一下。http://www.cnblogs.com/yykkciwei/archive/2009/05/08/1452889.html树状数组问题提出:已知数组a[],元素个数为n,现在更改a中的元素,要求得新的a数组中i到j区间内的和(1<=i<=j<=n).思考:对于这个问题,我们可以暴力地来解决,从a[i]一直累加到a[j],最坏的情况下复杂度为O(n),对于m次change&querry,合起来的复杂度为O(m*n),在n或m很大的情况下,这样的复杂度是让人无法忍受的.另外,如果没有元素的变更,我们完全可以存储sum[1,k]( 阅读全文
posted @ 2011-04-06 22:58 CoderZhuang 阅读(133) 评论(0) 推荐(0)
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1515http://www.cnblogs.com/liuqidong/archive/2010/07/26/1785076.html:本题并不是很难,就是输出所有能够目标WORD的可能。所以dfs+stack很容易解决。递归时有两种情况:第一:两个字符不相等(即栈顶字符与目标字符不相等);这种情况很容易处理,将匹配word的下一个字符入栈,指针向后挪已为继续递归。第二:两个字符相等(即栈顶字符与目标字符相等);这种情况有两种选择 (1)字符出栈,并将目标word的指针向后挪一位,继续递归;(2)将匹配wor 阅读全文
posted @ 2011-03-27 20:58 CoderZhuang 阅读(247) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3261给一串数组,数组最少含有k个相同子串,可重叠,求这样子串的最长长度。后缀数组求出height[],若连续k个height[]都大于mid,就可以了。当然要找最大的mid,这里可用二分查找.。关于后缀数组可以参考:http://hi.baidu.com/fhnstephen/blog/item/4b20757c37245d0429388a76.html#include <iostream>#include<stdio.h>#include<stdlib.h>using namespace std;co 阅读全文
posted @ 2011-03-19 14:36 CoderZhuang 阅读(161) 评论(0) 推荐(0)
摘要:Trie树就是字符树,其核心思想就是空间换时间。举个简单的例子。给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,第一次出现第几个位置。这题当然可以用hash来,但是我要介绍的是trie树。在某些方面它的用途更大。比如说对于某一个单词,我要询问它的前缀是否出现过。这样hash就不好搞了,而用trie还是很简单。现在回到例子中,如果我们用最傻的方法,对于每一个单词,我们都要去查找它前面的单词中是否有它。那么这个算法的复杂度就是O(n^2)。显然对于100000的范围难以接受。现在我们换个思路想。假设我要查询的单词是abcd,那么在他前面的单词中,以b,c 阅读全文
posted @ 2011-03-14 22:33 CoderZhuang 阅读(339) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3080不多说与poj3450 差不多,都是求几个字符串拥有的相同子串,并是最长的。不过这题要求子串长度不低于3,还有各个提供的字符串长度也都相等。所以是把做过的poj3450稍微改下,很给力0ms通过。Source CodeProblem: 3080User: 541780774Memory: 708KTime: 0MSLanguage: G++Result: AcceptedSource Code#include <stdio.h>#include <stdlib.h>#include<string.h> 阅读全文
posted @ 2011-02-28 14:20 CoderZhuang 阅读(138) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3450给数个字符串,若这些字符串中拥有相同的子串,求最大长度的子串,长度相等取ASCII码小的。这题也是可以用KMP算法来解,用一个字符串枚举去匹配其它的串,找到一个最长的就可以了。当然时间要用得长一些了。Source CodeProblem: 3450User: 541780774Memory: 920KTime: 282MSLanguage: G++Result: AcceptedSource Code#include <stdio.h>#include <stdlib.h>#include<string. 阅读全文
posted @ 2011-02-28 13:47 CoderZhuang 阅读(166) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3461题意:给两个字符串S,T;求S中最多含有多少个T。很显然直接贴个KMP算法就可以解决了。Source Code#include <stdio.h>#include <stdlib.h>#include<string.h>#include<iostream>using namespace std;int next[10001],n;struct { char str[1000001]; int len; }s,t; //主串s, 子串t。void get_next()//求模式串的“nex 阅读全文
posted @ 2011-02-27 01:08 CoderZhuang 阅读(112) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2406题意:字符串A分解为数个相同的字符串B,求B的最多的个数,如ababab,可由3个ab组成,abcabab由1个abcabab组成(即本身),aaaa由4个a组成。解题:本题并不要用到KMP的整个算法,而只是用到了KMP算法中的:next[i]的值。所于要对next[i]比较理解。以str="abcaababc"为例:i012345678串abcaababcnext[i] -100011212最后结果为ans=next[n]/(n-next[n])+1;n为字符串长度,如上面的"abcaababc&quo 阅读全文
posted @ 2011-02-26 21:56 CoderZhuang 阅读(245) 评论(0) 推荐(0)