数据结构
THE___BEST
这个作者很懒,什么都没留下…
展开
-
hdu2795
#include #include #include #include #include using namespace std; const int maxn = 200000 + 7; struct node { int left, right; int val; } str[maxn*10]; int w, h, n; int ans = -1; void Bui原创 2015-11-03 23:34:11 · 271 阅读 · 0 评论 -
AC自动机
问题:有多个单词,然后给出一个较长的字符串,问有多少个单词出现在这个字符串里面。这里要用到的就是AC自动机,AC自动机需要KMP和字典树知识,最好把这两样都弄懂了。 AC自动机其实就是字典树里面再加一个fail指针,这个fail指针的用处就是当当前字符无法被匹配时所要进行的转移,很想KMP算法里面的next数组,比如对于单词:qwert, wert, ert所构成的字典树如下:(世上最丑作图。。丑原创 2016-09-25 23:13:31 · 596 阅读 · 0 评论 -
伸展树(splay树)
在各种各样的数据结构中,有很多树,可以查找第k大的数,比如划分树,查找区间最大值,比如线段树,但是绝大部分的树形数据结构都不能进行区间删除,但是有一种数据结构能进行区间删除,还能进行树的合并,它既是伸展树。 伸展树跟平衡树等类似,也是一颗有序的二叉树,也有左旋右旋操作,查找插入删除等操作的平均复杂度也是log(n)级别的,他的特点就是在进行在对某个数进行操作时会将这个数旋转到树根的地方,这一特点就原创 2016-09-19 23:28:16 · 507 阅读 · 0 评论 -
字典树(Tire树)
引:假如有n(n很大)个字符串,有q个查询,每个查询表示在这n个串里面是否存在这个要查询的串。一种方法就是直接暴力查找,但是复杂度很高,稍微优化一点的方法是先把n个串排序,然后二分查找,但复杂度仍可以优化,hash或者字典树都可以,这里介绍字典树。字典树是一颗树,每个节点都有多个子节点,子节点的数量取决于字符的范围,比如如果只有小写字母子节点就有26个就足够了,例如对于这六个字符串:ab, ada,原创 2016-08-30 17:45:33 · 587 阅读 · 1 评论 -
HDU 5861 Road(线段树)
很暴力的写法。直接怼了三颗线段树,怕出错 思路就是先区间更新出每条路最早使用时间跟最短使用时间,然后再把这个区间维护到另一颗线段树上用于求每一天的总花费,注意当这条路自始至终都没有用到的话要特判,不然会RE#include <cstdio> #include <algorithm> #include <iostream> #include <cstring>using namespace std;原创 2016-08-18 19:47:18 · 410 阅读 · 0 评论 -
HDU 4192(中缀表达式转后缀表达式)
参考:点击打开链接 一、把中缀表达式转换为后缀表达式算法的基本思路是从头到尾地扫描中缀表达式中的每个字符,对于不同类型的字符按不情况进行处理。 1、先定义一个工作数组,用来存储转换之后的后缀表达式,定义一个栈,用来存储运算符。(越往栈顶优先级越高的原则)可以先定义一个‘#’优先级为0存入栈底 2、扫描:若遇到的是操作数,直接存入工作数组中,若遇到运算符,将该运算符与栈顶元素比较,若该原创 2016-04-23 18:59:23 · 805 阅读 · 0 评论 -
HDU 3487(伸展树模板)
再也不想写第二次。 题意:给一个n一个q 表示一开始有n个数 接下来q个操作 CUT a b c表示把[a, b]剪切到c处,FILP a b 将[a, b]区间翻转。 伸展树搞。 看的题解:点击打开链接 代码挺好理解的感觉。 #include #include #include #include #include #include #define value ch[ch[ro原创 2016-05-03 16:50:32 · 423 阅读 · 0 评论 -
hdu 2665 Kth number(划分树模板)
跟线段树类似的,对于每一层的中间位置的数 把比他小的放左边,比他大的放右边 #include #include #include #include #include using namespace std; const int maxn = 100000 + 7; int s[maxn]; int tree[25][maxn]; int toleft[25][maxn]; int T,原创 2016-04-12 15:04:40 · 343 阅读 · 0 评论 -
AC自动机模板
#include #include #include #include #include using namespace std; const int maxn = 1000000 + 7; const int type = 26; struct node { node *next[type]; node *fail; int cnt; }; node *q[ma原创 2016-02-03 22:51:44 · 370 阅读 · 0 评论 -
12299 RMQ with Shifts
线段树单点更新 区间查询 #include #include #include #include #include using namespace std; const int maxn = 100000 + 7; const int INF = ~0U >> 1; struct node { int left, right; int val; }str[maxn*5]原创 2016-02-16 05:53:33 · 321 阅读 · 0 评论 -
伸展树(splay)模板
神级数据结构 #include #include #include #include using namespace std; const int maxn = 200 + 7; int m, n; struct node { node *left, *right; node *par; int val, w; } *root; void RightRotate原创 2016-02-15 02:49:25 · 350 阅读 · 0 评论 -
Treap树模板
Treap包含了二叉查找树和堆的特性,而且性价比很高! #include #include #include #include #include using namespace std; const int INF = ~0U >> 1; struct node { node *left, *right; int val, fix; }; struct node *ro原创 2016-02-14 01:31:42 · 377 阅读 · 0 评论 -
1428 - Ping pong
树状数组。#include #include #include #include #include using namespace std; const int INF = 100000 + 7; const int maxn = 20000 + 7; typedef long long LL; int T, n, MAX; int left_[maxn], right_[maxn];原创 2016-01-23 16:07:16 · 309 阅读 · 0 评论 -
poj2481
/**对所有牛按先左端点s从小到大排序,如果s相等则按e从大到小排序 **/ /**这样遍历的时候只需要满足某个点在该点左边就可以了 **/ #include #include #include #include #include using namespace std; const int maxn = 100000 + 7; struct node { int x, y,原创 2015-11-04 16:16:45 · 497 阅读 · 0 评论 -
poj2481 树状数组
/**对所有牛按先左端点s从小到大排序,如果s相等则按e从大到小排序 **/ /**这样遍历的时候只需要满足某个点在该点左边就可以了 **/ #include #include #include #include #include using namespace std; const int maxn = 100000 + 7; struct node {原创 2015-11-04 16:14:45 · 322 阅读 · 0 评论 -
AVL树(平衡二叉树)
AVL树是排序二叉树的优化版,多了个调整操作,排序二叉树在某些情况下可能会变的跟链表差不多,比如连续插入多个非递减的数: 这就会使得各种操作非常费时间,几乎和链表一样。但是AVL树避免了这一点,保证了任意一个节点的左右儿子节点的高度差不会超过1,这就使得AVL树的复杂度很平衡(插入删除查找log(n))。 这里的调整操作是基于两个旋转操作来进行的,即左旋和右旋: 右旋: 左旋(实际上原创 2016-09-29 23:33:56 · 484 阅读 · 0 评论