- 博客(35)
- 资源 (1)
- 收藏
- 关注
原创 LCP数组的实现和最长公共连续子串
LCP数组(Longest Common Prefix Array, 高度数组):是由后缀数组中相邻两个后缀的最长公共前缀的长度组成的数组。 假设字符串S, 后缀数组sa, LCP数组lcp, 那么有后缀S[sa[i]...]与S[sa[i + 1]...]的最长公共前缀的长度为lcp[i]。 lcp的计算: (后缀数组的实现)假设S[i...]与S[sa[ra
2013-09-29 21:24:21 4800
原创 后缀数组的实现和字符串匹配
字符串后缀:从字符串的某个位置开始到字符串末尾的子串。 后缀数组:指将某个字符串的所有后缀按照字典序排序后得到的数组,但数组并不直接保存后缀字符串,只保存对应的其实位置。 S[]="suffixarray"的后缀数组sa[]isa[i]S[sa[i]...]011'\0'(空串)16array
2013-09-28 20:25:36 2352
原创 对字符序列循环向左(右)移动的技巧
给出一个字符序列S,求对S向左(右)循环移动i后的字符序列。 比如:S = abcdefg, i = 3, 则操作完成后S = defgabc (向右同理哦) 技巧:假如S = abcdefg, i = 3, 那么可以进行如下操作: 1) 对S的前i个字符进行翻转, 对于上例,则可以得到 abc => cba 2) 对S中i以
2013-09-28 18:40:28 1999
原创 最大流 Ford-Fulkerson算法
最大流和割的关系: 定理一:如果f是网络中的一个流,CUT(S,T)是任意一个割,那么f的值等于正向割边的流量与负向割边的流量之差。 证明: 设X和Y是网络中的两个顶点集合,用f(X,Y)表示从X中的一个顶点指向Y的一个顶点的所有弧(弧尾在X中,弧头在Y中:XY)的流量和。 只需证明:f=f(S,T)-f(T,S) 即可。下
2013-09-27 20:20:56 1329
原创 分桶法和平方分割(对区间的操作)
分桶法:把一排物品或者平面分成桶,每个桶饭分别维护自己的内部信息,以达到高效计算的目的的方法。 平方分割:把一排n个元素中每√n个元素分在一个桶内进行维护的方法,使对区间操作的时间复杂度降为O(√n)。 类似线段树哦。 给定一个n个整数的数列a1, a2, a3, ..., an和m个三元组表示的查询。对于每个查询(i, j, k)输出
2013-09-25 22:21:24 2584 1
原创 摘给给自己
“一心逐鹿不顾兔”的人则往往容易成功,必要的时候完全可以破釜沉舟,孤注一掷,有得必有失,有时候冒险还是值得的。 我崇尚那些不断进取的灵魂,我羡慕那些走到成功地位的个体,我理解所有为生命的价值而不懈努力的精灵。通向成功的道路有很多,失败并不可怕,可怕的是没有一点色彩,没有一点张扬的人生。 童年时惟一的精神资源就是由自己漫无边际的幻想所创造出来的自己
2013-09-22 15:54:05 921
原创 二叉搜索树的实现
二叉搜索树的删除: (1)、没有左孩子,直接把右孩子替代删除结点 (2)、有左孩子但左孩子没有右孩子,则把左孩子替代删除结点 (3)、其它,把左孩子的最大的结点替代删除结点 时间复杂度O(logn)#include #include struct node { node* left; node* right; in
2013-09-18 18:47:13 780
原创 Bellman-Ford最短路径和负圈判断
Ballman-Ford的最短路径算法是以边为单位进行的,而Dijkstra则是以顶点为单位进行的啦。 Ballman-Ford算法需要遍历所有|E|条边,最坏的情况下需要遍历|V - 1|*|E|条边,所以可以借助这个特点来判断图是否有负圈哦。 Ballman-Ford能够解决带有负圈的图。 时间复杂度为O(|E|*|V|)。#inc
2013-09-18 10:10:25 1610
原创 优先队列的实现
STL中有priority_queue可以实现优先队列。 下面的代码是小堆哦,是从小到大的顺序。#include #define MAX_N 2001int heap[MAX_N];int size;void push(int x) { int i = size++; int p; while (i > 0) { p = (i - 1) / 2;
2013-09-18 08:25:06 686
原创 hdu 1035 Robot Motion
hdu 1035 Robot Motion 深搜。#include #include #define MAX_N 11char map[MAX_N][MAX_N];int visited[MAX_N][MAX_N];int n, m;int sx, sy;int step, loopStep;bool dfs(int x, int
2013-09-15 17:14:05 820
原创 反复推进区间开头和末尾, 求解最小区间
给出一个n个整数的序列,求出最小的连续序列长度,使得ai + a(i+1) + ... + a(t)的和不小于S。 (1 比如: 输入 n = 10, S = 15, a = {5, 1, 3, 5, 10, 7, 4, 9, 2, 8} 输入 n = 5, S = 11, a = {1, 2, 3, 4, 5}
2013-09-15 16:56:38 858
原创 hdu 2571 命运
hdu 2571 命运 动态规划, dp[i][j] = max(dp[i - 1][j], dp[i][j - 1], dp[i][j / k])#include #define MAX 1005#define INF -0xffffff#define max(a, b) (a > b ? a : b) int dp[21][MAX];int m
2013-09-13 14:42:31 568
原创 hdu 1867 A + B for you again
hdu 1867 A + B for you again 题目没有说明输入一定是前一个字符串的后缀和后一个字符串匹配,所以需要进行两次kmp匹配,然后得出最大的匹配数。#include #include #define MAX 100005char strA[MAX], strB[MAX];int next[MAX];void getNext(char*
2013-09-13 10:36:16 743
原创 hdu 2594 Simpsons’ Hidden Talents
hdu 2594 Simpsons’ Hidden Talents 求第一个字符串StrA的前缀和第二个字符串strB的后缀的最大长度. 只要把strA当做模式串去匹配strB就可以啦, 不过还要注意被匹配串strB的长度哦。 例如 strA = 'abcabcabcabc', strB = 'abcabcabcabcabc' 答案却是 ab
2013-09-12 15:24:24 779
原创 hdu 1711 Number Sequence
hdu 1711 Number Sequence kmp基础题.#include #define MAX 10005int n, m;int a[MAX*100], b[MAX];int next[MAX];void getNext(int* arr, int* next) { int j, k; j = 0; k = -1;
2013-09-12 14:15:53 657
原创 不断减少时间复杂度的一个例子
问题:给出N张写有数字(k1, k2, ..., kn)的牌 和 一个数字M, 从中抽4次(每抽完一次要放回), 判断是否存在抽取4次牌上数字的和为M的组合是否存在。 1 输入:n = 3, m = 10, k = {1, 3, 5} n = 3, m = 9, k = {1, 3 , 5} 输出:yes(
2013-09-11 09:39:33 2160
原创 hdu xxxx Peragrams
PeragramsTime Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)Total Submission(s) : 1 Accepted Submission(s) : 1Font: Times New Roman | Verdana | GeorgiaFo
2013-09-09 08:27:41 1267
原创 hdu 2952 Counting Sheep
hdu 2952 Counting Sheep 简单深搜.#include #include #define MAX 105int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1};char map[MAX][MAX];bool visited[MAX][MAX];int T;int n, m;void dfs(int x,
2013-09-08 13:54:47 729
原创 hdu 2717 Catch That Cow
hdu 2717 Catch That Cow 广搜.#include #include using namespace std;#define MAX 100005struct node { int pos; int step;};int n, k;bool visited[MAX];int bfs(int s) {
2013-09-08 12:47:58 718
原创 hdu 2095 find your present (2)
hdu 2095 find your present (2) ^(异或)运算, 0 ^ a = a, a ^ b ^ b = a, a ^ (偶数个)b = a, 那么 0 ^ a ^ a = 0咯.#include int main() { int n; int k, a; int i; while (scanf("%d", &n) != EO
2013-09-08 11:30:09 682
原创 hdu 1217 Arbitrage
hdu 1217 Arbitrage 题意:判断是否有一种货币通过和其它不同的货币的汇率进行兑换, 最后是否会多出原来的价值.比如: 1美元去兑换, 1*0.5*10.0*0.21 = 1.05. Flody最短路径.#include #include #include using namespace std;#define MAX 35dou
2013-09-08 09:36:13 712
原创 hdu 2680 Choose the best route
hdu 2680 Choose the best route 反向建图, 然后计算终点到各点的最短路径.#include #include using namespace std;#define MAX 1001#define INF 0xffffffint map[MAX][MAX];bool visited[MAX];int lowco
2013-09-07 19:22:46 733
原创 hdu 1548 A strange lift
hdu 1548 A strange lift 广搜, 最短路径也可以做。#include #include using namespace std;#define MAX 205struct node { int floor, k; int step;};int n, a, b;node floors[MAX];bool
2013-09-07 19:17:49 674
原创 hdu 1385 Minimum Transport Cost
hdu 1385 Minimum Transport Cost Floyd最短路径和按字典序存放最短路径.#include #define MAX 105#define INF 0xffffffint map[MAX][MAX];int tax[MAX];int path[MAX][MAX];int n;void floyd() {
2013-09-07 15:02:06 1237
原创 hdu 2112 HDU Today
hdu 2112 HDU Today 求最短路径。 题目是双向图哦, 终点起点一样的话要输出0哦。#include #include #include #include using namespace std;#define MAX 200#define INF 0xffffffint g[MAX][MAX];bool
2013-09-07 11:36:34 894
原创 hdu 1257 最小拦截数
hdu 1257 最小拦截数 最小递增子序列.#include #define MAX 30005#define INF 0xffffffint d[MAX];int a[MAX];int binSearch(int* arr, int left, int right, int key) { int mid; while (left < right) {
2013-09-04 00:10:40 618
原创 hdu 1677 Nested Dolls
hdu 1677 Nested Dolls 题意: 如果一个布娃娃a的h和w都大于另一个布娃娃b的h和w, 那么b就能嵌套在a里面, 要求所有娃娃嵌套后的最小个数. 先对娃娃的w按从大到小排序, 如果w相等, 则按h从小到大排序, 求出lis.#include #include using namespace std; #define MAX
2013-09-04 00:06:10 1246
原创 hdu 2444 The Accomodation of Students
hdu 2444 The Accomodation of Students 二分图的判断和最大匹配, 二分图还有一个名字叫"双色图"吧, 顾名思义吧, 图中的任一条边相连的两个顶点颜色是不同的哦.这就可以把图分成两部分啦, 假设一部分是白色, 一部分是黑色, 那么二分图中的任一边都是连着两个不同颜色的顶点了. 题目需要判断n学生的关系是否满足
2013-09-03 23:56:05 787
原创 hdu 2063 过山车
hdu 2063 过山车 二分图最大匹配.#include #include #define MAX 505bool map[MAX][MAX];bool visited[MAX];int match[MAX];int k, n, m;bool dfs(int v) { int i; for (i = 1; i <= m; i++) { if (
2013-09-03 23:47:24 772
原创 hdu 1513 Palindrome
hdu 1513 Palindrome 求出字符串的顺序和逆序的最长公共子序列的长度, 插入数 = 字符串的长度 - 最长公共子序列长度。 这道题给出的是最长可以5000的字符串长度哦,假如使用一般的方法来开个二维数组,那么内存会不够的啦, 那么就用滚动数组吧。 这道题需要的是最长公共子序列的长度, 那么可以放弃一些之前的状态, 因为只需要dp
2013-09-03 00:42:02 678
原创 hdu 1159 Common Subsequence
hdu 1159 Common Subsequence 最长公共子序列的模板题啦。 这里有一个关于lcs问题的分析 最长公共子序列dp解法#include #include #define MAX 1005int dp[MAX][MAX];char a[MAX], b[MAX];inline int max(int a, i
2013-09-03 00:20:37 446
原创 hdu 2546 饭卡
hdu 2546 饭卡 01背包...#include #include #include using namespace std;#define MAX 1005int dp[MAX], c[MAX];int n, v;inline int max(int a, int b) { return a > b ? a : b;}inline void
2013-09-02 00:24:57 565
原创 hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 01背包的对物品的选择方案只有 0(不拿) 和 1(拿)吧, 完全背包对一件物品i的选择就有 k 种啦, k 多重背包, 拆分物品分成多件, 这里是用2的幂作为拆分因子的. 假如当一件物品i的数量c和价值p的乘积c*p大于背包总量时, 可以认为物品i的数量无限啦, 所以就可
2013-09-02 00:21:32 639
原创 hdu 1248 寒冰王座
hdu 1248 寒冰王座 简单完全背包...#include #include #define MAX 10005int dp[MAX];int p[4] = {0, 150, 200, 350};inline int max(int a, int b) { return a > b ? a : b;}int main() { int T, mon
2013-09-02 00:08:50 834
原创 hdu 1203 I NEED A OFFER!
hdu 1203 I NEED A OFFER! 01背包. 题目中要求求出至少拿到一个offer的概率, 这样不好求, 那就求它的对立面, 即 拿不到任何一个offer的最小概率, 这样就可以转为01背包了.#include #define MAX 10005double dp[MAX], p[MAX];int w[MAX];inline d
2013-09-02 00:03:05 559
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人