------------数据结构-------------
文章平均质量分 70
_Rain_Stopped
这个作者很懒,什么都没留下…
展开
-
AC自动机+矩阵快速幂 POJ 2778
题意:有m种DNA序列是有疾病的,问有多少种长度为n的DNA序列不包含任何一种有疾病的DNA序列。(仅含A,T,C,G四个字符) 首先我们需要知道 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值 把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j。令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i原创 2016-05-12 21:03:43 · 1037 阅读 · 1 评论 -
AC 自动机 HDU 2896
自动机水题,注意输出的是web的编号不一定连续以及别忘了输出冒号 #include using namespace std; int ans[505],n,m,sum; char buf[10010],str[505][205]; struct Trie { int next[505*205][128],fail[505*205],end[505*205]; int root,原创 2016-05-11 13:38:57 · 414 阅读 · 0 评论 -
AC自动机 HDU3065
自动机水题 注意多组输入!!!! #include using namespace std; int ans[1001],n; char buf[2000010],str[1001][55]; struct Trie { int next[50001][128],fail[50010],end[50001]; int root,L; int newnode()原创 2016-05-11 12:12:33 · 510 阅读 · 0 评论 -
AC自动机入门+模板 (HDU 2222)
Aho-Corasick算法是多模式匹配中的经典算法 多模式匹配就是有多个模式串P1,P2,P3…,Pm,求出所有这些模式串在连续文本T1….n中的所有可能出现的位置。 步骤 1.建立模式的Trie 2.给Trie添加失败路径 3.根据AC自动机,搜索待处理的文本 重难点 构造失败指针 设这个节点上的原创 2016-05-10 23:17:33 · 429 阅读 · 0 评论 -
莫队算法入门 + 模板 Codeforces 617E
题意已知一个长度为n的数列 (0 ≤ ai ≤ 1 000 000) ,给m个区间,问每个区间有多少个子区间xor和为k (1 ≤ n, m ≤ 100 000, 0 ≤ k ≤ 1 000 000) 莫队算法 如果你知道了[L,R]的答案。你可以在O(1)的时间下得到[L,R-1]和[L,R+1]和[L-1,R]和[L+1,R]的答案的话。就可以使用莫队算法。 先对序列分块。然后原创 2016-05-13 20:07:58 · 2368 阅读 · 1 评论 -
AC自动机+矩阵快速幂 HDU 2243
做这个题之前最好做一下POJ 2278(题解) 在POJ2278的基础上, 最终的答案就是26^1+26^2+......+26^L减去A^1+A^2+....+A^L 我们构造这么一个矩阵 |A , 1| |0 , 1| 它 的n次方等于 |A^n , 1+A^1+A^2+....+A^(n-1)原创 2016-05-13 13:00:59 · 1012 阅读 · 0 评论 -
主席树入门+模板 POJ 2104
查询区间第K大,而且没有修改。 主席树的原理就是在现有的一颗线段树上不断加入新的节点,而加入的对于现有线段树的影响另开一条链记录下来,这样我们就可以保存线段树的历史版本,在查询时只需要把区间减一下就可以了。 #include #include #include using namespace std; const int maxn = 1e5+7; vectorq; int a[maxn原创 2016-05-14 00:07:18 · 535 阅读 · 0 评论 -
主席树水题 HDU2665
和POJ 2104一模一样,不多说 #include using namespace std; const int maxn = 1e5+6; struct node {int l,r,sum;}T[maxn*20]; int root[maxn],a[maxn],cnt; vector q; int getid(int x){return lower_bound(q.begin(),q.e原创 2016-05-14 10:28:07 · 651 阅读 · 0 评论 -
HDU 4417 主席树
区间查询 查询[l,r]区间只需要将第r棵线段树[0,H]区间的总数减去第l-1棵的就行了。 需要注意的是边界的处理 #include using namespace std; const int maxn = 1e5+6; struct node {int l,r,sum;}T[maxn*20]; int root[maxn],a[maxn],cnt; vector q; int ge原创 2016-05-14 13:48:38 · 463 阅读 · 0 评论