这是一道神题。
首先我们需要建立AC自动机,然后再建个Fail树,之后发现
如果询问a串在b串中出现了几次,那么只需要看b串在AC自动机上所有的节点中有多少个节点,在a串的结束节点在Fail树上的子树中就可以了。
然后这样做就很可以了,但是仍然不能AC,
这时我们只需要按照Fail树的dfs序建立数据结构(我写了树状数组)进行区间查询就好了。
这时对于以上的b串,...
分类:
其他好文 时间:
2015-01-19 17:15:24
阅读次数:
128
线段树解决,类似的,数状数组也行。
点修改,区间查询 都是 logn 的复杂度。
没有使用自底向上的ZKW线段树写法,就普通的递归线段树。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defi...
分类:
其他好文 时间:
2015-01-11 21:45:23
阅读次数:
269
基本上敲的模板功能:区间更新,区间查询自己随意开发。。 1 #include "iostream" 2 using namespace std; 3 #define lson l,m,rt>1)) * p[rt];23 sum[rt> 1) * p[rt];24 p[...
分类:
其他好文 时间:
2014-12-30 01:40:57
阅读次数:
179
对于这类区间查询的问题,如果可以用O(1)的复杂度推到一个曼哈顿距离为1的另外区间的话,就可以直接用莫队算法搞。从网上搜到的有两种搞法。第一种是先建立曼哈顿距离最小生成树,然后直接dfs遍历整棵树来求解的。还有一种是先分块,然后把查询按照块的编号为第一关键字,右边界为第二关键字排序,排序直接直接暴力...
分类:
编程语言 时间:
2014-12-14 14:33:46
阅读次数:
194
这里是最基本的操作。单操作时间复杂度O(logN),空间复杂度O(N). 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 int n,m; 8 int a[100002],tree[100002]; 9 10 vo...
分类:
编程语言 时间:
2014-12-05 00:31:33
阅读次数:
218
CODEVS1369 xth 砍树题目大意:区间查询和,单点修改区间中点。思路:比较简单的线段树,可是在double和float上栽了跟头,以后统一用double,输出printf里面用f,不要用llf(我zuo)。#include#includeusing namespace std;int tr...
分类:
其他好文 时间:
2014-11-14 01:27:06
阅读次数:
315
题目大意:给出一棵树,每一个节点有一个权值,一开始所有节点的权值都是0。有两种操作,0 x y代表以x为根节点的子树上所有点的权值增加y。1 k a1 b1 a2 b2 ……ak bk代表询问。一共有k条边( k
思路:子树修改,区间查询,很明显用树链剖分解决,树链剖分维护一个size域,那么x的子树的范围就是pos[x]到pos[x] + size[x] - 1这一段上,可以用线段树...
分类:
其他好文 时间:
2014-10-25 09:19:42
阅读次数:
136
题目链接:poj 2763 Housewife Wind
题目大意:给定一棵树,然后2种操作:
0 u:输出路径s到u的权值和,并且s变成u1 i w:节点i增加w
解题思路:树链剖分,然后用线段树维护,单点修改区间查询。
#include
#include
#include
using namespace std;
const int maxn = 100005;
...
HDU 3333 Turing Tree
题目链接
题意:给定一个数组,每次询问一个区间,求出这个区间不同数字的和
思路:树状数组离线处理,把询问按右端点判序,然后用一个map记录下每个数字最右出现的位置,因为一个数字在最右边出现,左边那些数字等于没用了,利用树状数组进行单点修改区间查询即可
代码:
#include
#include
#include
#inc...
分类:
编程语言 时间:
2014-10-16 11:18:12
阅读次数:
220
题目大意:给定一个序列,提供下列操作:
1.将[l.r]区间内每个数a[i]变为sqrt(a[i])
2.查询[l,r]区间的和
根号是不支持区间修改的,于是我们选择单点修改区间查询的树状数组,但是这样是O(n^2)的,怎么办?
我们发现一个数x最多开loglogx次根号就会变为1 也就是一个int范围内的数只要开5次根号就会变为1 于是修改的总时间复杂度为O(nloglogn)
但是单...
分类:
编程语言 时间:
2014-10-10 16:03:44
阅读次数:
217