- 博客(430)
- 资源 (9)
- 收藏
- 关注
原创 HDU 1869 floyd 求两点间的最短距离
求两点之间的最短距离//memset(map, 0x1ffffff, sizeof(map));//错误的初始化方式正确使用memset的方式是,初始指定的是8位的数值。比如说memset(map, 0x3f, sizeof(map)); 则map如果是int类型,则被初始化为4个3f 即 0x3f3f3f3f#include using namespace std;#define
2013-01-26 22:18:15 882
原创 HDU 3007 最小圆覆盖
题意:给出平面上的一些点,要求用一个最小的圆,把所有的点包围起来。最小覆盖圆, 增量法假设圆O是前i-1个点得最小覆盖圆,加入第i个点,如果在圆内或边上则什么也不做。否,新得到的最小覆盖圆肯定经过第i个点。然后以第i个点为基础(半径为0),重复以上过程依次加入第j个点,若第j个点在圆外,则最小覆盖圆必经过第j个点。重复以上步骤(因为最多需要三个点来确定这个最小覆盖圆,所以重复三次)
2013-01-25 21:12:48 4121 2
原创 HDU 1370 打表 || 中国剩余定理
题意:有3个循环周期,周期天数分别为23、28、33。对于某一年,已知某年这3个周期的某一峰值分别是当年的第p、e、i天,问从第d天开始到最近一个满足3个周期都达到峰值的日期还有多少天。数据比较小,直接打表可过:# include int tab[40][40][40]; int cal(int num){ if (num <= 0) return num + 21252 ; r
2013-01-25 21:02:10 910
原创 HDU 1134 大数取模 使用大数模板
#include #include #include #include using namespace std; char str[1010];int modd;#define MAXN 9999#define MAXSIZE 10#define DLEN 4class BigNum{ private: int a[1010]; //可以控制大数的位数 i
2013-01-25 20:35:44 4646
转载 c++ 大数类 大数模板
转自:http://blog.csdn.net/hackbuteer1/article/details/6595881分别使用C++中的运算符重载的方法来实现大数之间的数学运算,包括加法、减法、乘法、除法、n次方、取模、大小比较、赋值以及输入流、输出流的重载。。 并且使用这个大数模板,顺利AC了HDOJ上的1134这个题目的Catalan数计数问题。。http://acm.
2013-01-25 20:23:36 23210 9
原创 HDU 1358 KMP运用 求某串中所有循环前缀串的长度和循环次数
解题思路:这个题其实用的是next[]数组的性质来求周期、假设前K个元素匹配成功,则有str[1]=str[i-next[i] ],str[2]=str[i-next[i]+1]······str[i]=str[next[i]]。那么我们知道从str[0]到str[next[i]]是字符串的一个循环周期,即i-next[i]为重复的长度,那么长度为K的字符串中的循环次数为i/(i-next[i
2013-01-25 19:39:58 1705
原创 HDU 1496 等式求解 简单hash
没有判断同号,超时了半天。#include using namespace std;#define N 2000010#define M 1000010int res[N];int res2[N];int t[101];int main(){ for(int i = 0; i <= 100; i++) { t[i] = i * i; } int a, b, c,
2013-01-25 19:02:56 613
原创 HDU 1423 最长上升公共子序列
参考:http://www.cnblogs.com/nuoyan2010/archive/2012/10/17/2728289.html#include#includeusing namespace std;const int N = 505;int num1[N],num2[N],f[N][N];int main(){ int t,n,m; scanf("%d",&t);
2013-01-25 17:15:15 3008
原创 HDU 1381 hash
主要思路:将出现的字符用nc进制的数来表示,保证其不会重复出现。。若有重复子字符串则这个数就相同,len-n+1 总的子字符串个数。。这个需要仔细观察。hash存储查找一遍重复的--最后就只剩下不重复的子字符串的个数了。 #include #include #define N 16000007int hash[8000000],assi[27];char str[N];int a
2013-01-25 16:26:17 1340 1
原创 HDU 1753 大数 strchr
#include#includeint a[1010],b[1010],sum[1010];char str[1010];int main(){ int i,j,k,n,s,c; while(scanf("%s",str)==1) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(sum,0,sizeof(su
2013-01-18 16:44:15 567
原创 HDU 1316 大数
打表方法有点特别对齐方法也不错。#include #include #include #include #define M 105char a[M+2], b[M+2];char book[1000][M+2];int cmp(char *s1, char *s2) { for(int i = 0; i <= M; i++) { if(i == M) { r
2013-01-18 15:51:17 995
原创 HDU 3247 AC自动机 + 状态压缩dp
小HH:乳鸽的神题,状态很容易看出来,有50000*1024,很难保持,我用散列表超时了,用bitset刚好可以卡过,不过后来我想,只有尾结点才有效,中间的很多结点完全可以忽略,可以先用最短路吧各个尾结点之间的距离算出来,经过测试,不到50个点,马上就优化到50*1024了,本来9s多过的优化到了100多MS#include #include #include #include #in
2013-01-18 13:10:36 781
转载 树形dp 和 状态压缩dp
状态压缩动态规划动态规划的状态有时候比较难,不容易表示出来,需要用一些编码技术,把状态压缩的用简单的方式表示出来。典型方式:当需要表示一个集合有哪些元素时,往往利用2进制用一个整数表示。*:一般有个数据 n*:确定了为状态DP,那么第一步就是预处理,求出每行所有可能的状态了,cnt记录总的状态数,stk[]记录所有的可能状态。以炮兵阵地为例:int cnt, stk[MAX];
2013-01-16 21:57:45 759
原创 PKU 1185 炮兵阵地 经典状态压缩dp
思路:状态压缩DP。很经典的状态压缩DP。用int型来表示每行的状态(如果int型的二进制的第i位为1,则表示这一行的第i列有安装大炮)。这样的话由于最多有10列,故由计算可得最多有60种状态。DP部分:dp[r][i][k]表示第r行的状态为k,第r-1行的状态为i时候,前r行最多能够安装的大炮数量。 #include#define max(a,b) ((a)>(b)?(a):(b))
2013-01-16 21:55:57 728
原创 PKU 2778 HDU 2243 AC自动机 + 矩阵乘法
矩阵乘法:http://blog.csdn.net/vsooda/article/details/8510131构造trie图,继而构造出初始矩阵,mat[i][j]表示i走到j有几种走法 ,这个矩阵自乘n次之后就表示i走到j走n步有几种走法问你长度为N的串中不包含了模式串的串有几个n属于1 ~ 2000000000看到这个数据范围我们就应该敏感的想到这是矩阵~最多100个结点,先
2013-01-16 18:32:01 758
原创 PKU 3233 经典矩阵乘法
S = A + A2 +A3 + … + Ak. 的一个很好的求法是构造这样一个矩阵A A0 1然后这个矩阵自乘K次即可,也就是矩阵套矩阵 #include #include const int MAX = 65;int n, k, m, tn, mod;struct Mat{ int mat[MAX][MAX]; Mat() { memset(mat,
2013-01-16 16:46:57 799
原创 HDU 3065 病毒侵袭持续中
目标串中各个模式串出现了几次这就更简单了,都不用把out标记成false了题目中的病毒都是大写字母这个条件应该怎么用?#include #include #include #include #include #include #include #include #include #include #include #include #include #incl
2013-01-16 15:59:24 561
原创 HDU 2896 病毒侵袭 AC自动机
这题的字母范围为128.要注意的是,匹配之后不能将val[tmp] = 0; 因为下一个例子还要使用。#include #include #include #include #include #include #include #include #include #include #include #include #include #include using
2013-01-16 15:39:20 504
原创 HDU 2222 AC自动机经典题目
应用模板,对模板有更深入的理解。1. 当前结点的失败指针 等于 父节点的失败指针指向的结点的的同个字母儿子结点的指针 2. v = chd[ fail[u] ][i];这句为了别的结点计算败者指针提供便利。无其他作用。3. work在结点之间的转移方式 #include #include #include #include #incl
2013-01-16 11:12:39 594
转载 HDU 2825 AC自动机模板
首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。
2013-01-15 09:53:59 925
原创 PKU 3067 Japan 树状数组
求道路的交叉点数。将道路按左边城市从大到小排序。如果相同则按右边从大到小排序。这样就跟stars和cows一样了。#include #include using namespace std;const int maxn = 1010;int c[maxn],result[maxn];typedef struct{ int e, s;} node;node nd[
2013-01-14 09:21:30 585
原创 PKU 2481 COWS 排序 + 树状数组
排好序后就跟stars那题一样了一次遍历排序后的数组,由于比当前遍历元素strong的区间只可能存在于已经遍历过的元素中;所以我们可以放心大胆的直接对树状数组求和然后向后更新树状数组中统治x的点上的值,因为那些位置都多了一个比 以他们为左端点的区间 强壮 的区间;#include #include using namespace std;const int maxn =
2013-01-13 11:00:18 578
原创 PKU 1195 二维树状数组
题目大意:给定n*n矩阵,和几种在线操作,包括对某一点(x,y)值修改,查询一个矩形(l, b, r, t)的元素和。二维的树状数组,直接把Update()和Getsum()改为二维即可#include using namespace std;const int maxn = 1100;int tree[maxn][maxn];int Lowbit(int x) { re
2013-01-12 22:44:59 654
原创 PKU 2352 Stars 求比较小的数字个数
题目意思就是求每个星星左下方的星星的个数,由于y轴已经排序好了,我们可以直接用按x轴建立一维树状数组,然后求相当于它前面比它小的个数,模板直接一套就搞定了~~#include using namespace std;const int MAX = 32000 + 10;int c[MAX], level[MAX];int Lowbit(int x) { return
2013-01-11 21:37:19 707
原创 PKU 2299 求解逆序数(使用归并或者树状数组) 树状数组及入门知识
归并ac代码为:#include #include using namespace std;#define MAX 500005int a[MAX], t[MAX];__int64 cnt;void Merge(int l, int mid, int r){ int i = l, j = mid + 1, k = 0; while(i <= mid && j <= r
2013-01-11 15:41:03 684
原创 HDU 1247 trie 一个单词是否是两个单词的连接
#include using namespace std; char list[50001][26]; const int kind = 26; int cnt = 0; struct Treenode { bool flag; Treenode *next[kind]; Treenode() { flag = false; f
2013-01-10 22:09:08 576
原创 HDU 1671 静态trie(字典树)
#include #include using namespace std;const int MAXNODE = 500000;const int BRANCH = 10;int tree[MAXNODE][BRANCH];int SIZE; //结点下标bool key[MAXNODE];//是否是某个单词bool Insert(char *str) { int node
2013-01-10 19:56:30 1048
原创 HDU 1686 统计子串的个数 kmp 调了半天
题意不解释了。第一版本代码:WA#include #include using namespace std;char s1[1000000+10], s2[10000+10];void get_nextval(char* T, int nextval[]){ int i = 1, j = 0; nextval[1] = 0; while(i < T[
2013-01-10 11:02:53 916 1
原创 HDU 1711 KMP 初级
最初级的kmpnext数组有模式串计算得来。相对于朴素匹配的区别在于,主串的 i 不再后退,而只是扫描一遍过去。当发现不匹配的时候,根据next数组的找到模式串的对应位置进行比较。next的值由 最前真前缀和真后缀的最大长度决定。具体参考数据结构课本。#include #include using namespace std;void get_nextval(int* T
2013-01-09 21:38:57 516
原创 PKU 3225
题意:区间操作,交,并,补等思路:我们一个一个操作来分析:(用0和1表示是否包含区间,-1表示该区间内既有包含又有不包含)U:把区间[l,r]覆盖成1I:把[-∞,l)(r,∞]覆盖成0D:把区间[l,r]覆盖成0C:把[-∞,l)(r,∞]覆盖成0 , 且[l,r]区间0/1互换S:[l,r]区间0/1互换成段覆盖的操作很简单,比较特殊的就是区间0/1
2013-01-03 21:36:54 462
原创 PKU 2528 WA
题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报思路:这题数据范围很大,直接搞超时+超内存,需要离散化:离散化简单的来说就是只取我们需要的值来用,比如说区间[1000,2000],[1990,2012] 我们用不到[-∞,999][1001,1989][1991,1999][2001,2011][2013,+∞]这些值,所以我只需要1000,1990,2000,2012就够
2013-01-03 20:29:25 622
原创 PKU 3468
与上题类似。只是变成了累加。每次更新的时候要更新sum值(加)多了query的操作。与update类似#include using namespace std;#define lson l, m, rt << 1#define rson m+1, r, rt << 1 | 1#define LL long longconst int maxn = 1111111;LL add
2013-01-03 14:42:42 735
原创 HDU 1698 线段树进阶,成段更新
成段更新(通常这对初学者来说是一道坎),需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候#include using namespace std;#define lson l, m, rt << 1#define rson m+1, r, rt << 1 | 1const int maxn = 111
2013-01-02 22:10:16 703
原创 HDU 2795
题意:h*w的木板,放进一些1*L的物品,求每次放空间能容纳且最上边的位子思路:每次找到最大值的位子,然后减去L线段树功能:query:区间求最大值的位子(直接把update的操作在query里做了).转自not only success#include using namespace std;#define lson l, m , rt << 1#define rson m+1
2013-01-02 20:34:27 1019
原创 HDU 1394 最小逆序数
#include using namespace std;#define lson l, m , rt << 1#define rson m+1, r, rt << 1 | 1const int maxn = 5555;int sum[maxn<<2];void pushUp(int rt){ sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void
2013-01-02 20:06:53 613
原创 HDU 1166
接下来的线段树题目,主要来源于notonlysuccess。第一题:#include #define lson l, m , rt << 1#define rson m+1, r, rt << 1 | 1const int maxn = 55555;int sum[maxn<<2];void pushUp(int rt){ sum[rt] = sum[rt<<1] + s
2013-01-02 19:05:49 480
转载 vim配色文件
.vimrc文件如下set t_Co=256set tabstop=4set shiftwidth=4set hlsearchsyntax onset nuset autoindentset cindentset softtabstop=4set smartindentset fileencodings=ucs-bom,utf-8,gb2312,cp936,chinese
2012-12-28 21:41:43 749
转载 __cdecl __fastcall与 __stdcall
调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。 1、__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈, 2、_cdecl是C和C++程序的
2012-12-28 14:55:35 572 2
转载 C/C++内存管理详解
伟大的Bill Gates 曾经失言: 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。 1、内存分配方式
2012-12-22 19:49:16 799
转载 编辑距离
题目描述:要求两字符串有差异的字符个数。例如: aaaaabaaaaa aaaaacaabaa 这两个字符串,最大公共字串长度是5,但它们只有两个字符不同,函数输出值应为2。 如果是: aaabbbcccddd aaaeeeddd 函数的输出值应该是6。 比较形象地形容一下,把两个字符串排成上下两行,每个字符串都可以在任何位置插入空格以便上下对齐,每个列
2012-12-18 10:53:46 5747 1
计算机视觉:一种现代方法(第二版)清晰文字版(英文版)
2013-03-14
线性规划与网络流题解
2012-09-26
OpenCV 2 Computer Vision Application Programming Cookbook 全
2012-06-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人