哈希
LowestJN
强省弱OIer
展开
-
[BZOJ2795] [Poi2012] [字符串hash] A Horrible Poem
一个字符串的最小周期等于这个字符串的长度-border的长度 那么如果x是字符串的周期,[l,r-x]一定和[l+x,r]相等。 然后发现x一定是字符串的长度的约数,就枚举一下约数,字符串hash判一判就可以了线性筛预处理一下可以O(log)质因数分解#include <cstdio> #include <iostream> #include <algorithm> #define N 5000原创 2017-05-27 19:47:26 · 512 阅读 · 0 评论 -
[线段树 哈希] Codeforces452F. Permutation
考虑第 ii 位上的数 aia_i ,如果对于任意 k∈[1,min(ai−1,n−ai)]k\in[1,\min(a_i-1,n-a_i)] ,ai−ka_i-k 和 ai+ka_i+k 都在它左边或者都在它右边,那么就不会存在以 aia_i 为中位数的长度为3的等差数列。那么我们从左往右扫这个数列,用权值线段树记录哪些数出现过,那么就是判断区间 [ai−k,ai][a_i-k,a_i] 和 [a原创 2017-10-06 18:28:02 · 373 阅读 · 0 评论 -
[概率DP 哈希] POJ3156 .Interconnect
可以发现一个状态跟联通块的形态是无关的,只跟联通块的大小有关每次可以加一条边,可能会使两个联通块联通,也可能什么都不会改变。记忆化搜索一下#include <cstdio> #include <algorithm> #include <iostream> #include <map> #define fi first #define se secondusing namespace std;type原创 2017-09-23 11:40:55 · 294 阅读 · 0 评论 -
[主席树维护HASH] Codechef. Cloning
传送门直接用主席树维护HASH比较就可以了吧…#include <cstdio> #include <algorithm> #include <iostream>using namespace std;typedef unsigned long long ll;const int N=100010; const ll base=100003;int t,n,q,cnt; int a[N],rt[N]原创 2017-08-29 11:23:51 · 403 阅读 · 0 评论 -
[主席树维护HASH && SET维护DFS序] Codechef. Walks on the binary tree
传送门每次加一个串 x 会增加 n-max{LCP(x,i)},因为是树上,max{LCP(x,i)}就肯定是dfs序中跟它相邻的点,也就是它们的lca深度最深。 那么就用set维护一下dfs序,比较的话,用主席树维护hash#include <cstdio> #include <iostream> #include <algorithm> #include <set> #include <cst原创 2017-08-29 11:22:11 · 423 阅读 · 0 评论 -
[最短路 && 主席树维护HASH] 51nod1863 Travel
把一条路径上的点值按排名顺序排序,那么路径的优劣就是字典序。相当于是求一条字典序最大的路径。 最长路然后就是老套路,用主席树来维护hash,就可以在O(log)的时间里比较两个串的字典序,然后就套最短路就可以了用对优化的DIJ复杂度就是O((N+M)lognlogn)O((N+M)\log n\log n)#include <cstdio> #include <iostream> #include原创 2017-08-29 11:13:14 · 759 阅读 · 0 评论 -
[最短路 && 主席树维护HASH]Codeforces 464E. The Classic Problem
传送门 老套路 跟51nod1863一样。 就是多了进位#include <cstdio> #include <iostream> #include <algorithm> #include <set> #include <cstring> #include <string> #include <vector> #include <queue> #include <assert.h> #def原创 2017-08-29 11:16:46 · 461 阅读 · 0 评论 -
[字符串HASH && 阈值]Codeforces 741E.Arpa’s abnormal DNA and Mehrdad’s deep interest
传送门 这题写的心态都崩了…被卡常被卡HASH首先可以把每个位置插入T后的字典序排序出来。 发现两个不同的位置i,j中插入T,两个字符串有一段前缀一段后缀是相同的,中间可以按T的端点分成3部分,只要比较这3部分的字典序就可以了。我被卡常就是因为用了字符串hash来比较字典序…那么写一个比较函数,然后直接用std::sort就好了询问也很麻烦。 发现第二个限制可以写成x+⌊ik⌋×k≤i≤y+⌊原创 2017-08-28 13:21:55 · 775 阅读 · 0 评论 -
[树上启发式合并 && 哈希] Codeforces 741D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
日常VP翻车学一发树上启发式合并,%%%gjghfd 树上启发式合并可以截这里每次递归做轻儿子,做完后清空轻儿子信息(注意是做完一个轻儿子后发现清空这个),然后做重儿子,再dfs所有轻儿子并跟新当前点的答案,然后把轻儿子信息加进去……说起来很绕,其实挺好理解的… 每个节点的哈希值就是它到根路径哪些字符出现奇数次,记录就是记录每个哈希值的深度的最大值,然后类似求路径长度搞一搞就好了#include原创 2017-08-27 20:43:21 · 842 阅读 · 0 评论 -
[字符串HASH][复杂度分析] NOI2017 .Day1 T2 蚯蚓排队
因为k只有50,所以先把所有询问的字符串拆开,加到hash表里,然后用链表模拟整个过程,暴力把新产生的或消失的字符串在hash表里更新答案,复杂度就是对的 具体做法和时间复杂度分析可以看lzz的知乎回答 https://www.zhihu.com/question/62597216#include <cstdio> #include <iostream> #include <algorithm>原创 2017-07-24 12:32:21 · 1551 阅读 · 0 评论 -
[线段树 || 主席树][Hash] HackerRank 101 Hack 49. Sorting Lists
传送门这题有两种做法考场上写了逐位确定的方法,但是没时间调了就交了暴力…先考虑区间1,如果里面不同的方案数小于k,那么任何一个1为前缀的序列都不是答案,否则1一定是答案的前缀,然后考虑2…可以用hash判重来记录一个区间里的方案数。#include <cstdio> #include <iostream> #include <algorithm> #include <ctime> #include原创 2017-07-08 21:15:53 · 527 阅读 · 0 评论 -
[分块][哈希] [Romanian IOI 2017 Selection #6] Jolteon && [LOJ #6187] Odd
在loj上看到的题,跟CF77F差不多 但是这不是一个线段,而是一些数字,就不能用同样的方法hash,问了大佬Manchery,恰好他一周前做过……传送门不过loj上数据更强吧…我Hash打错调了一晚上……#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> #include <string> #in原创 2017-07-06 00:51:41 · 1063 阅读 · 0 评论 -
[树的同构][二分][可并堆维护哈希] LOJ#6066 || BZOJ4928 && 2017 山东一轮集训 Day3. 第二题
这题一看就可以二分 那么解决这题的关键就变成了怎么对树进行哈希,以及怎么快速维护哈希值 想了一个下午想了一个比较靠谱的哈希方法。 用一个p进制数(p>n且为质数)来表示每一个节点,这个数有depth位,depth位这个节点的深度,那么这个数在p进制下第i位表示这个点的depth-i的祖先是其父亲的第几个儿子。 大概长这样 子树中所有节点的哈希值之和作为这个子树的哈希值。 因为每个哈希值的原创 2017-07-11 18:07:31 · 922 阅读 · 0 评论 -
[Codeforces799F] [哈希] Beautiful fountains rows
%%%Manchery给每个区间随机一个权值,这样每个位置被哪些区间覆盖奇数次就可以用区间权值的xor值表示,假设为x,一个区间被哪些区间覆盖也可以用xor值表示,假设为y 那么满足x=y的区间就是符合条件的区间前缀和搞一搞,map记一记就好啦#include <cstdio> #include <iostream> #include <algorithm> #include <vector> #原创 2017-05-19 19:47:08 · 1357 阅读 · 0 评论 -
[线段树 哈希] BalkanOI 2016. Haker
题目是给定一个字符串,有三种操作.一种是询问两个子串是否相同一种是区间内的 aa 变成 bb,bb变成 cc … zz 变成 aa一种是区间 [L,R][L,R] 变成原串的区间 [k,k+R−L][k,k+R-L] 的子串因为要判断是否相同,肯定就要HASH,因为第二种操作,要记一下每个字母出现的位置的hash值第三种操作的话,用前缀和记一下原串的hash,打一个标记就好了复杂度 O(nlogn×原创 2017-10-31 11:40:38 · 406 阅读 · 0 评论