Hash
青烟绕指柔!
我不怕千万人阻挡,只怕自己投降。
展开
-
单词
题目链接:单词令 dp[i] 为以i结尾要选一个区间的方案数。然后我们可以知道当前要包含的位置,然后从前面更新,然后前面是一个前缀和的和。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e6+10;const int base=131,mod=99824353原创 2021-03-07 23:13:28 · 68 阅读 · 0 评论 -
HDU - 5172
题目链接:HDU - 5172对每个排列集合哈希即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e6+10,mod=1e18;mt19937 rnd(time(0));int n,m,a[N],h[N],sum[N],p[N];void solve()原创 2020-09-12 22:19:04 · 202 阅读 · 0 评论 -
Codeforces - Reachable Strings
题目链接:Codeforces - Reachable Strings我们可以发现每次0的移动都是不改变当前0的位置的左右1的奇偶性。并且0是不可能改变相对位置的,所以我们对0的个数以及位置的左边1的奇偶性哈希即可。代码当中((i&1)+1)*base) ,加上1是为了保证1的个数的哈希,位运算是对于不同左端点的奇偶位置哈希。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.原创 2020-09-11 12:06:03 · 164 阅读 · 0 评论 -
Codeforces - Shortest Path
题目链接:Codeforces - Shortest Path跑BFS的时候,对每个点记录是从哪个点过来的,然后就变成快速check3个点是否合法了。哈希即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=3e3+10;int n,m,k,d[N][N],原创 2020-08-24 17:55:56 · 225 阅读 · 0 评论 -
可重集
题目链接:可重集显然这种题就是用各种hash去做的。如果是判断一个区间是否完全相等,我们可以给每个值换一个随机值,然后区间异或哈希。但是现在是差分相等,如果是区间异或的话,做加法很困难。所以我们可以考虑用次幂哈希。例如:5 = base ^ 5这个就很好做加法了。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusin原创 2020-07-29 16:13:26 · 617 阅读 · 0 评论 -
Adnan and the Burned drivers
题目链接:Adnan and the Burned drivers显然维护正反字符串的哈希值,那么直接判断即可。由于有修改,所以用线段树维护。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10;const int mod=1e9+3,base=131;原创 2020-07-05 13:37:32 · 227 阅读 · 0 评论 -
Censoring S
题目链接:Censoring S因为每次都是找一个个位置,所以我们可以考虑用一个栈维护最早出现的位置。然后怎么判断当前栈顶的字符串是否满足呢?AC自动机或者字符串hash都可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e6+10;const int mo原创 2020-07-01 23:47:06 · 323 阅读 · 0 评论 -
[POI2010]ANT-Antisymmetry
题目链接:[POI2010]ANT-Antisymmetry显然长度只可能是偶数。所以我们可以枚举每一段的右半段的左端点。然后把字符串反转,二分即可。check字符串相等直接哈希。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=5e5+10,mod=1e9+3原创 2020-06-04 18:45:54 · 238 阅读 · 0 评论 -
HDU - 3973
题目链接:HDU - 3973 AC’s String显然我们可以提前预处理每个子串的hash值。然后对每个区间,我们需要快速求出hash值,并且支持修改。所以线段树维护即可。每次查询在set当中找一下。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+1原创 2020-05-14 19:08:28 · 220 阅读 · 0 评论 -
Codeforces - Watto and Mechanism
题目链接:Codeforces - Watto and Mechanism我们可以采用hash值来看是否存在某个字符串。所以我们对一个字符串每次枚举每个位置不同,然后看是否存在这个hash值即可。codeforces上面一般都必须双hash,否则Hack。然后一般双哈希都是采用孪生素数1e9+7 , 1e9+9.AC代码:#pragma GCC optimize("-Ofast","...原创 2020-02-12 18:25:59 · 180 阅读 · 0 评论 -
解方程
因为a比较大,使用高精度去计算必然会TLE。于是我们可以利用hash的思想,相当于对等式,两边同时取模。这里我使用了孪生素数来双hash,增加可靠性。计算多项式直接秦九韶就行(初中知识应该都会)AC代码:#pragma GCC optimize(2)#include<bits/stdc++.h>#define int long longusing namespac...原创 2019-12-21 16:31:01 · 252 阅读 · 0 评论