09 2011 档案

最大子序列问题小结
该文被密码保护。

posted @ 2011-09-26 18:58 buptLizer 阅读(47) 评论(0) 推荐(0)

poj3320 快排离散
摘要:题目要求求出包含所有ideas的最段序列,如果整数的范围很小的话就简单了,但是这个题目中idea可能很大,因此无法直接用数的大小对应下标所以必须离散化才可以,因为数一共有1000000,所以最大编号最大为1000000,利用快排离散。m[i]为原始数据,s[i]为压缩后每个idea对应的编号,index[i]为每个编号出现的下标,其实这个题就是之前遇到的那个求包含给定字符集的最短子串是一个问题,只是这个题目多了一个离散。源代码:#include <iostream>#include <algorithm>#include <stdio.h>using nam 阅读全文

posted @ 2011-09-25 12:32 buptLizer 阅读(448) 评论(0) 推荐(0)

poj1804逆序数
摘要:冒泡求逆序数View Code #include <iostream>#include <stdio.h>using namespace std;const int N=1001;int m[N],s[N];int main(){ int t,n,i,j,sstep,mstep,tmp,cnt=1; bool flag=false; scanf("%d",&t); while(0 <= --t) { scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d&qu 阅读全文

posted @ 2011-09-23 10:51 buptLizer 阅读(220) 评论(0) 推荐(0)

有道笔试面试题(1)
摘要:最基本:虚函数,quick sort,三次握手 ok,进程通信 1.虚函数 作用:实现动态联编,即在程序执行期间动态的选择合适的成员函数。 封装、继承和多态。 2.快排 void quickSort(int l,int r) { if(lb[j]) {++j;} else {++i;} } } 12.//最大子矩阵和 m[N][N] int getMaxSub(int *a,int len) { int curMax; curMax=a[0]; for(i=0;i>n>>m; for(int i=0;iresult) result=tmp; } } } 13.//链表快排 n 阅读全文

posted @ 2011-09-22 15:13 buptLizer 阅读(851) 评论(0) 推荐(0)

钩子函数(一道面试题的启发)
摘要:在10M的源码中查找内存泄露。这个是网上随便看的一个面试题,看到博主写的解法,提到一个钩子函数,我连什么是钩子函数都不知道,人家都能想到用这个方法来解决,感觉自己太龊了,如果面试中问到这种题,肯定挂了。下面先介绍下钩子函数。摘至网上:钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。对每种类型的钩子由系统来维护一个钩子链,最近安装的钩子放在链的开始,而最先安装的钩子放在最后,也就是后加入的先获 阅读全文

posted @ 2011-09-22 13:25 buptLizer 阅读(472) 评论(0) 推荐(0)

欢迎光顾我的博客
摘要:欢迎大家光顾我的博客,喜欢我的可以给我留言,如果发现哪个题目有什么问题或者不正确的,给出的评论会仔细给你回复的奥。 阅读全文

posted @ 2011-09-18 22:18 buptLizer 阅读(87) 评论(0) 推荐(0)

poj 1816 trie树+dfs(强烈推荐,含有通配符的匹配)
摘要:这个题目花了我一晚上才调出来,其实也不难,就是在trie树上搜索给定的单词,但是麻烦的一点是考虑的情况非常多,比如模式串可能重复,或者*?连续出现,最开始都没考虑,程序敲出来直接提交一看WA,然后看discuss里面,说模式可能重复我才知道情况比我想的要复杂,重新该了下程序,还是WA,主要是没考虑到情况*后面忘了判断有无*或者?的情况,最后WA了好几次才A的,程序跑了235M,前30呢,哈哈,多亏了某某大牛的一组测试数据。我会在代码后面附上这组数据,希望后面做这个题得不要犯我这钟低级错误。测试数据:View Code 1000 100zdgnjcjbftwkmitipstcz*ygn?srhw 阅读全文

posted @ 2011-09-18 22:16 buptLizer 阅读(9002) 评论(0) 推荐(0)

poj3368 RMQ
摘要:题目大意说给出一系列数,这列数是不降的,然后任意给出一个区间[i,j],让你求出那个重复次数最多的数的出现次数。由于给出的查询次数很多,我就考虑用RMQ来解,但是这个不能直接套用模板,因为加入我们对区间[i,j]进行查询,如果从k处分开取两边区间的最大的重复次数是不一定正确的,因为分开的那个地方可能把实际重复次数最多的那个数一分为二,这样求出的就不是最大的了,所以只需要多加一个判断,从分开出往左往右循环找到最大的重复次数,看这个数是否大于我们当前得到的那个数(这个数是取左右区间的最大值)。代码如下:#include <iostream>#include <cmath># 阅读全文

posted @ 2011-09-17 18:04 buptLizer 阅读(1114) 评论(0) 推荐(0)

poj2452 Sticks Problem RMQ问题
摘要:题目大意说:给出一系列的木棒的长度,求出一个最大的区间[x,y],满足所有的len[k]>len[i] && len[k]<len[j] ,i<=k<=j。我看的题目分类说这个题目用RMQ,所有就用了RMQ实现,由于开始的时候我是枚举的所有的区间,所以肯定超时,后来改为从i找出以i开始的最大区间范围,然后在这个范围内求出最大值的下标j,那么j就是从i开始的所有>i且<j的最大区间,枚举采用二分,这样时间复杂度为O(nlogn).#include <iostream>#include <stdio.h>#include 阅读全文

posted @ 2011-09-17 12:01 buptLizer 阅读(367) 评论(0) 推荐(0)

poj1330Nearest Common Ancestors LCA问题 dfs+rmq
摘要:题目意思很简单就是求两个节点的LCA,这个问题可以转化为rmq问题,求区间的最小值。就是首先利用dfs遍历图的所有顶点并且每条边会遍历两次,这样遍历的顶点总共2*n-1个,依次将遍历的边存在数组e[i]中,并且记录每个顶点的深度,存入数组level[i]中,我们再开一个数组存每一个顶点首次出现的下标,记录在idx中,这样任意给出两个顶点,我们求出他们对应的下标x,y,然后根据level数组在区间[x,y]中找出深度最小的下标r,这个下标对应的e就是我们要求的节点。这个题目就是将LCA转化为在某段区间中找高度最小的那个顶点。代码如下:#include <iostream>#inclu 阅读全文

posted @ 2011-09-16 21:46 buptLizer 阅读(248) 评论(0) 推荐(0)

转 海量数据处理(2)
摘要:十七道海量数据处理面试题与Bit-map详解出处:http://blog.csdn.net/v_july_v前言 本博客内曾经整理过有关海量数据处理的10道面试题(十道海量数据处理面试题与十个方法大总结),此次除了重复了之前的10道面试题之后,重新多整理了7道。仅作各位参考,不作它用。 同时,程序员编程艺术系列将重新开始创作,第十一章以后的部分题目来源将取自下文中的17道海量数据处理的面试题。因为,我们觉得,下文的每一道面试题都值得重新思考,重新深究与学习。再者,编程艺术系列的前十章也是这么来的。若您有任何问题或建议,欢迎不吝指正。谢谢。第一部分、十五道海量数据处理面试题1. 给定a、b两个文 阅读全文

posted @ 2011-09-13 21:21 buptLizer 阅读(235) 评论(0) 推荐(0)

转 海量数据处理(1)
摘要:海量数据处理:十道面试题与十个海量数据处理方法总结出处:http://blog.csdn.net/v_JULY_v。------------------------------------------第一部分、十道海量数据处理面试题1、海量日志数据,提取出某日访问百度次数最多的那个IP。 首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法,比如模1000,把整个大文件映射为1000个小文件,再找出每个小文中出现频率最大的IP(可以采用hash_map进行频率统计,然后再找出频率最大的几个)及相应的频率。 阅读全文

posted @ 2011-09-13 21:20 buptLizer 阅读(373) 评论(0) 推荐(0)

大数据处理小结
摘要:1.从海量数据中找出中位数题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。方案1:网上的解法都是千篇一律,方法都是将整数分段,映射都n个区间段,然后对每个区间段计数,当curSum>5G的时候停止计数,并统计中位数所在区间的每个取值的个数进行第二次统计,这样就得到了第5G大的数据了,这个的确是个好方法吧,算法的时间复杂度是线性的,因为是遍历了两次数据。方案2:采用编程之美上的一个思路,我们无法将5G的数据装入内存,那么就转入相对小的数据。比如取k为2G,我们利用最大堆,找出第2G大的数据,然后再遍历一次,找到第4G大的数据,然后建立1G大 阅读全文

posted @ 2011-09-13 21:18 buptLizer 阅读(521) 评论(0) 推荐(0)

转载一篇好文章:《海量数据处理常用思路和方法》
摘要:最近有点忙,稍微空闲下来,发篇总结贴。 大数据量的问题是很多面试笔试中经常出现的问题,比如baidu google 腾讯 这样的一些涉及到海量数据的公司经常会问到。 下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎与我讨论。 1.Bloom filter 适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集 基本原理及要点: 对于原理来说很简单,位数组+k个独立hash函数。将hash函数对 阅读全文

posted @ 2011-09-11 21:31 buptLizer 阅读(264) 评论(0) 推荐(0)

优先队列使用
摘要:这个是转得网上的,由于不经常使用,偶尔用的时候还经常出错,所以记下来了,经常使用的已经用红色颜色标出来了 :在优先队列中,优先级高的元素先出队列。标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。优先队列的第一种用法,也是最常用的用法:priority_queue<int>qi;通过<操作符可知在整数中元素大的优先级高。故示例1中输出结果为:9 6 5 3 2第二种方法:在示例1中,如果我们要把元素从小到大输出怎么办呢?这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。priority_queue<int,vector< 阅读全文

posted @ 2011-09-11 17:48 buptLizer 阅读(5654) 评论(1) 推荐(0)

差分约束系统
摘要:小结:差分约束就是用最短(最长路径)来解决满足一系列约束条件的问题的最优解,首先约束条件必须满足一定的限制,即每个约束条件系数只能为1,-1这样的不等式。差分约束系统的解题过程大致为:a 建立约束图增加一个原点,根据约束条件构造约束图。b 利用dijkstra或者bellman_ford求出最短(长)路径,如果有负边,只能用后者。如果题目要求出最小值,我们将所有的不等式转化成>=,构造出约束图,开始的时候每个dist[i]赋值为-INF,然后求最长路径,这个是原点距离固定的情况,比如题目poj1201,mina是最小坐标,minb是最大坐标,题目让求的是dist[maxb]-dist[m 阅读全文

posted @ 2011-09-11 17:18 buptLizer 阅读(236) 评论(0) 推荐(0)

poj1201 查分约束系统
摘要:oj1201 查分约束系统和1716是同一类题目,求出包含区间中至少c个数的最小集合,建立约束图,就最长路径,把所有的符号转化为>=,利用spfa求解,这个题不能用bellman_ford,会超时。#include <iostream>#include <stdio.h>#include <queue>using namespace std;const int N=50002;const int INF=100000;struct node{ int to,w,next;};node edge[N*3];int n,num,maxb,dist[N],a 阅读全文

posted @ 2011-09-10 22:41 buptLizer 阅读(467) 评论(0) 推荐(0)

poj 3159 Candies
摘要:这题目做的一个纠结啊。N个人份糖果,其中含有约束条件,即对于a,b,c有 b-a<=c,看到这个不等式马上感觉到要用最短路解决了,问Sn-S1的最大值是多少,我们令S1=0即求Sn的最大值,查分约束题目,求最短路,初始原点1到2,3,..,n的距离为INF,每次松弛找到第一组满足约束条件的解,这个解就是最大值,但是这个题目有问题啊,用最常用的bellman_ford无法通过啊,n,m值太大了,只能用spfa或者其他的优化方法,这个题用spfa+stack,用queue也会超时的,我猜想可能stack的访问效率较后者快吧,我最开始用的dijkstra+优先队列,不是超时就是WA,WA的时候 阅读全文

posted @ 2011-09-10 22:40 buptLizer 阅读(330) 评论(0) 推荐(0)

poj1738 an old stone game
摘要:石子合并,经典dp,我们定义dp[i][j]表示从i开始的j个石子合并的最小(最大)代价,dp方程为:dp[i][j]=min{dp[i][k]+dp[i+k][j-k]+sum[i][j]},sum[i][j]表示从i开始的j个数的和。这个题目由于规模太大了,无法开一个5000*5000的数组,需要用到其他方法,discuss里面说用Garsia Wachs算法,没听说过,有待研究。下面的是我处理小规模的dp代码:#include #include using namespace std;const int INF=1000000001;const int N = 500;int m[N], 阅读全文

posted @ 2011-09-09 12:00 buptLizer 阅读(642) 评论(0) 推荐(0)

poj3034 Whac-a-Mole (dp)
摘要:打地鼠游戏,dp好题,麻烦的不是写出dp方程,而是求出从(x1,y1)到(x2,y2)这条直线上经过那些整数坐标,利用gcd求出来,并且需要知道的一点是中间的某个点可能跑出到矩形外面,处理跑出矩形外地点只需要扩大范围就行了,行列各增加10,让冒出地鼠的坐标响应的+5即可,dp[t][x][y]表示时刻t坐标xy出得最大个数,那么此状态可能是由上一个状态dp[t-1[i][j]转移过来的,其中(i,j)和(x,y)距离<=d,我们去所有可能的ij中的最优值,代码如下:#include <iostream>#include <cmath>#include <st 阅读全文

posted @ 2011-09-08 15:01 buptLizer 阅读(417) 评论(0) 推荐(0)

poj3624Charm Bracelet 01背包
摘要:经典动态规划题目,这个题目最开始用的书本的思想,用m[i][j]表示前i件物品重量不超过j的最大价值,则dp方程为:m[i+1][j]=max(m[i][j-w[i+1]]+p[i+1],m[i][j]),也就是从i+1件物品中得到重量不超过j的最大价值的时候,第i+1件要么选要么不选,但是这个题目由于w和n比较大,这么会MLE,所以必须缩小空间,由于m[i][j]只和当前i的重量和价值有关系,对于当前的物品我们要么选要么不选,我们直接用一维数组表示 dp[j]=max(dp[j-w[i]]+p[i],dp[j])。计算的时候要从后往前计算。代码:#include <iostream&g 阅读全文

posted @ 2011-09-07 21:40 buptLizer 阅读(174) 评论(0) 推荐(0)

枚举
摘要:1.生理周期题目链接:http://poj.org/problem?id=1006水题,直接枚举满足条件的日期。2.称硬币题目链接:http://poj.org/problem?id=1013一共12个硬币,每个硬币两种状态,我们枚举可能的假币,一共24种。3.完美立方Perfect Cubes题目链接:http://poj.org/problem?id=1543求满足等式a^3=b^3+c^3+d^3的所有可能的组合。水题。for(a=5;a<=n;a++) { for(b=2;b<n;b++) {if(m[a]<3*m[b])break; for(c=b;c<n;c 阅读全文

posted @ 2011-09-07 10:57 buptLizer 阅读(242) 评论(0) 推荐(0)

poj1102 7段数码管
摘要:就是一个模拟题,显示出0-9这些数字的形状。我写的代码比较繁琐,牛人们忽略吧。#include <iostream>#include <stdio.h>using namespace std;char digit[9][11];int s,n,d[10];void init(){ memset(digit,'\0',sizeof(digit)); strcpy(digit[0],"1011011111"); strcpy(digit[1],"1000111011"); strcpy(digit[2],"0 阅读全文

posted @ 2011-09-05 22:20 buptLizer 阅读(373) 评论(0) 推荐(0)

poj1852 Ants
摘要:说一个长度为m的杆,上面有n个蚂蚁,告诉每个蚂蚁的初始位置,每个蚂蚁速度都是一样的,问所有的蚂蚁离开杆的最短和最长时间是多少。模拟题,所有的蚂蚁看成一样的,可以这样理解,即使相撞按反方向走,但是两只蚂蚁从开始爬到相撞到继续相背爬,这个时间都是一样的。所以直接对每只蚂蚁分别处理,得出他的最短离开时间和最长离开时间,我们分别从最短离开时间和最长离开时间里面求出最大的。源码:#include <iostream>#include <stdio.h>using namespace std;int main(){ int m,n,l,pos,left,right,curMin,c 阅读全文

posted @ 2011-09-05 22:17 buptLizer 阅读(871) 评论(0) 推荐(0)

poj2244 约瑟夫环
摘要:这个题目说给出n个数,第一个数必须出列,然后计算编号从2-n开始,使得2最后一个出列的最小的m值,其实也就是n-1约瑟夫环,从1-n-1s=1;for(i=2;i<=n-1;i++) s=(s+m)%i;if(s==1) m为所求,我们让m从1开始。。源码如下:#include <iostream>#include <stdio.h>using namespace std;const int MAX=150;int main(){int i,s,n,m,rs[MAX];for(n=3;n<MAX;n++){m=1;while(1){s=1;for(i=2;i 阅读全文

posted @ 2011-09-05 15:05 buptLizer 阅读(517) 评论(0) 推荐(0)

poj 2635 高精度取模
摘要:给出一个大整数10^100 KEY,这个数是两个素数的积,然后给出一个数L,如果KEY存在小于L的素数,则返回false,并输出这个最小的素数,如果大于等于L,则输出true。由于L并不是很大,我们先将素数表打出来,利用大整数取模运算来计算是否存在小于L的素数,由于KEY比较大,我们先转化成大进制数加快运算#include <iostream>#include <stdio.h>using namespace std;const int N=101;const int MAXN=1000010;char str[N];bool isPrim[MAXN];int key[ 阅读全文

posted @ 2011-09-04 15:42 buptLizer 阅读(1185) 评论(0) 推荐(0)

poj百练2737大整数除法
摘要:题目链接:http://poj.grids.cn/practice/2737#include <iostream>#include <string.h>#include <stdio.h>using namespace std;const int N=102;char s1[N],s2[N];int p1[N],p2[N],result[N];int subStract(int *a1,int *a2,int len1,int len2){ int i; if(len1<len2) return -1; if(len1 == len2) { i=len 阅读全文

posted @ 2011-09-04 15:36 buptLizer 阅读(1104) 评论(0) 推荐(0)

poj2389 大整数乘法
摘要:#include <iostream>using namespace std;const int N=42;char str1[N],str2[N];int s1[N],s2[N],result[2*N];int main(){ int i,j,len1,len2,len; memset(str1,'\0',sizeof(str1)); memset(str2,'\0',sizeof(str2)); for(i=0;i<2*N;i++) result[i]=0; cin>>str1; cin>>str2; len1=st 阅读全文

posted @ 2011-09-04 15:34 buptLizer 阅读(626) 评论(0) 推荐(0)

一些面试题(3)
摘要:转载:http://gushuizerotoone.iteye.com/blog/7457311.stl vector list deque的区别 http://www.iteye.com/wiki/topic/732365 使用区别: 1 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector ,支持[] 2 如果你需要大量的插入和删除,而不关心随即存取,则应使用list ,不支持[] 3 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque,deque是vector和list的结合 2.vector的内存管理机制: http://blog.sina.co... 阅读全文

posted @ 2011-09-03 11:40 buptLizer 阅读(254) 评论(0) 推荐(0)

一些面试题(2)
摘要:转载:http://gushuizerotoone.iteye.com/blog/737780注意时间复杂度 1.给出一个数列,找出连续相加最大的和 方法:(1)O(n) 一次扫描,如果sum<0, sum = 0. 英文数据结构书p23 (2)O(nlogn) devide and conqure 左右两边分别找最大,合并后的值,看看最后左、右、合并三个哪个最大 英文数据结构书p21 ================================================================= 2.二分查找 O(logN)整个数列已经之前排过序才能二分查找。每次比较 阅读全文

posted @ 2011-09-03 11:34 buptLizer 阅读(658) 评论(0) 推荐(0)

一些面试题(1)
摘要:转载 http://blog.csdn.net/dongfengsun/article/details/1541926今天去9City笔试才发现很多基本的东西都忘记了,以后面试前要看看这篇文章了!唉,老了!①链表反转单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:stru 阅读全文

posted @ 2011-09-03 11:30 buptLizer 阅读(526) 评论(0) 推荐(0)

博弈小结
摘要:这几天一直再看博弈的东西,现在按照自己的理解总结一下:首先需要明白的是必胜态和必败态的理论:1所有的末状态为必败态;2从P状态只能转移到必胜态N;3从N从能找到一个转移使其到P状态。下面将的所有的定理结论都是基于这三条的,所以应该好好理解。一、博弈论基础知识1巴什博弈(bash game)一堆含有n个石子游戏,每次只能去1..m个,问先手是必胜还是必败,这个很简单,只需要判断n%(1+m)就行了。2威佐夫博弈有两堆石子,每次要么从一堆中取出任意一个,要么从两堆中取走相同数量的石子,先取光着为胜,为先手是否必胜,这个用到了一个结论,就是奇异和非奇异局势。一个奇异局势不管怎么转移都转换为非奇异的, 阅读全文

posted @ 2011-09-02 11:47 buptLizer 阅读(270) 评论(0) 推荐(0)

博弈 取石子
摘要:题目链接:http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=65Description champ最近在和dalong玩一个取石子游戏,游戏规则很简单:有三堆石子,两人轮流取,每次任选两堆石子,然后从一堆中取走x(x>=1)个石子,另一堆中取走2*x个石子,最后不能取者输掉游戏,champ每一次都先取。 现在,champ告诉你初始三堆石子的数量,他想知道,自己是否有必胜的策略。你可以假定champ和dalong都足够聪明,每次都会选择最优的策略。Input多组测试数据每行3个正 阅读全文

posted @ 2011-09-02 11:12 buptLizer 阅读(455) 评论(0) 推荐(0)

导航