
模板
文章平均质量分 54
baodream
这个作者很懒,什么都没留下…
展开
-
一维差分、二维差分模板
【代码】一维差分、二维差分模板。原创 2024-08-28 17:41:36 · 376 阅读 · 0 评论 -
AC自动机(Aho-Corasick 多模式匹配算法)
AC自动机是解决多模式串匹配算法,常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。AC自动机一般用三步: 1.建立模式的Trie(字典树) 字典树模板:https://blog.youkuaiyun.com/baodream/article/details/80685799 2.给Trie添加失败路径(fail指针) ...原创 2018-08-04 17:01:03 · 1230 阅读 · 0 评论 -
线段树模板
贴一份线段树的区间修改和查询大模板const int N = 1e6+5;int a[N],n; //输入数据,构造线段树数组struct node{ int lft,rht; int sum; //区间和 int maxx; //区间最大值 int minn; //区间最小值 int lazy; //延迟标记,减小时间复杂...原创 2018-08-02 10:46:18 · 158 阅读 · 0 评论 -
1000亿以内的素数统计(Meisell-Lehmer算法)
1e11内的数差不多都能在5秒内处理完代码:#include<bits/stdc++.h> using namespace std; typedef long long LL;const int N = 5e6 + 2;bool np[N];int prime[N], pi[N]; int getprime() { int cnt = 0; ...原创 2018-08-01 10:10:30 · 1690 阅读 · 0 评论 -
离散化的两种操作
离散化是程序设计中一个常用的技巧,它可以有效的降低时间复杂度。其基本思想就是在众多可能的情况中,只考虑需要用的值。离散化可以改进一个低效的算法,甚至实现根本不可能实现的算法。要掌握这个思想,必须从大量的题目中理解此方法的特点。 有些数据本身很大, 自身无法作为数组的下标保存对应的属性。如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理。当数据只与它们之间的相对大小有关,而与具...原创 2018-08-03 16:34:08 · 4551 阅读 · 1 评论 -
莫比乌斯反演模板
莫比乌斯函数:莫比乌斯两种反演:d|n,表示n能够整除d,也就是d是n的所有因子μ(x)是莫比乌斯函数,它是这样计算的:(1).μ(1) = 1 (2).x = p1 * p2 * p3 ……*pk(x由k个不同的质数组成)则μ(x) = (-1)^k (3).其他情况,μ (x) = 0两条性质:(Φ(n)是欧拉函数)求莫比乌斯函数值代码:const int N = 1e6 + 5;int m...原创 2018-06-01 21:51:57 · 655 阅读 · 0 评论 -
欧拉函数模板
欧拉函数定义可看:数论四大定理欧拉函数的一些性质:欧拉公式的延伸:一个数的所有质因子之和是 E(n)*n/2。欧拉定理:对于互质的正整数a和n,有a^E(n) ≡ 1 mod n。欧拉函数是积性函数——若m,n互质,E(m*n)=E(m)*E(n)。若n是质数p的k次幂,E(n)=p^k-p^(k-1)=(p-1)*p^(k-1),因为除了p的倍数外,其他数都跟n互质。特殊性质:当n为奇数时,E(...原创 2018-06-01 20:16:27 · 656 阅读 · 0 评论 -
中国剩余定理(孙子定理)
中国剩余定理给出了以下的一元线性同余方程组:中国可求解该方程:假设整数m1,m2, ... ,mn两两互质,则对任意的整数:a1,a2, ... ,an,方程组 (S)有解。具体解释过程可看:代码:void ex_gcd(ll a, ll b, ll &x, ll &y, ll &d){ if (!b) {d = a, x = 1, y = 0;} else...原创 2018-05-31 22:08:08 · 1343 阅读 · 0 评论 -
数论四大定理
介绍一下数论四大定理:数论四大定理:1.威尔逊定理当且仅当p为素数时:( p -1 )! ≡ -1 ( mod p )或者这么写( p -1 )! ≡ p-1 ( mod p )或者说若p为质数,则p能被(p-1)!+1整除2.欧拉定理欧拉定理,也称费马-欧拉定理若n,a为正整数,且n,a互质,即gcd(a,n) = 1,则a^φ(n) ≡ 1 (mod n)φ(n) 是欧拉函数欧拉函数是求小于等...原创 2018-05-31 20:49:18 · 15364 阅读 · 0 评论 -
字典树模板
字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 具体解释可看:链接传送门 数组代码模板:const int MAXN = 1000005; //数...原创 2018-06-13 21:56:56 · 365 阅读 · 0 评论 -
最小编辑距离算法 Edit Distance(经典DP)
编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,编辑距离越小,两个串的相似度越大。最小编辑距离模板:int dp[1005][1005]; /*dp[i][j]表示表示A串从第0个字符开始到第i个字符和B串从第0个字符开始到...转载 2018-05-23 11:36:32 · 61207 阅读 · 11 评论 -
扩展KMP模板(EX_KMP)
贴一份扩展KMP模板://扩展KMP可求问题:给出一个长为N的字符串S,再给出一个长为M的字符串T//求S的所有后缀中和T的最长公共前缀//假设s为文本串(长度为n),T为模式串(长度为m)char s[N],T[N];int n,m;int Next[N]; //Next[i]代表T[i~m-1]与T[0~m-1]最长公共前缀int ex[N]; //exte...原创 2018-08-13 16:30:40 · 414 阅读 · 0 评论 -
快速读入fread
namespace IO{ #define BUF_SIZE 100000 #define OUT_SIZE 100000 #define ll long long //fread->read bool IOerror=0; inline char nc(){ static char buf[BUF_SIZE],*p1=bu...原创 2018-08-13 16:53:42 · 968 阅读 · 0 评论 -
斯特林数
第一类斯特林数定理:第一类斯特林数S1(p,k)计数的是把p个对象排成k个非空循环排列的方法数。证明:把上述定理叙述中的循环排列叫做圆圈递推公式:S1(p,p)=1(p>=0),有p个人和P个圆圈,每个圆圈就只有一个人S1(P,0)=0(P>=1)如果至少有1个人,那么任何安排都至少包含一个圆圈S1(P,K)=(P-1)*S1(P-1,K)+S1(P-1,K-1)...原创 2018-10-20 12:01:22 · 270 阅读 · 0 评论 -
开根号
1.牛顿迭代法double sqrt(double x) { if (x == 0) return 0; double last = 0.0; double res = 1.0; while (res != last) { last = res; res = (res + x / res) / 2; } ...原创 2018-10-16 20:44:36 · 782 阅读 · 0 评论 -
二维树状数组几种模板
1.单点更新,区间查询int tree[N][N]; //行列分开看,每一行每一列都是一个一维树状数组int n,m; //n行m列int lowbit(int x){return x&(-x);}//单点更新,区间查询void add(int x,int y,int val){ //单点更新 while(x<=n){ fo...原创 2018-10-18 21:02:19 · 1642 阅读 · 1 评论 -
FFT模板
FFT-快速傅里叶变换FFT在算法竞赛中就有一个用途:加速多项式乘法FFT主要两个过程:1.将系数表示法转化成点值表示法相乘(DFT)2.再由点值表示法转化为系数表示法(IDFT) 贴一份FFT模板,HDU1402,高精度乘法,把每一位当成对应系数,然后FFT,最后注意进位。#include <stdio.h>#include <string.h&...原创 2018-10-06 17:27:26 · 359 阅读 · 0 评论 -
线性基
线性基:定义:设数集TT的值域范围为[1,2^n−1][1,2^n−1]。 TT的线性基是TT的一个子集A={a1,a2,a3,...,an}。 A中元素互相xor所形成的异或集合,等价于原数集TT的元素互相xor形成的异或集合。 可以理解为将原数集进行了压缩。即生成了一组线性无关向量组。 性质:1.设线性基的异或集合中不存在00。 2.线性基的异或集合中每个元素的异或方案...原创 2018-10-12 12:52:40 · 910 阅读 · 0 评论 -
求四维偏序模板
四维偏序模板题:https://blog.youkuaiyun.com/baodream/article/details/82778387四维偏序裸题思路,CDQ套CDQ即a通过flag标记,在CDQ2的时候,b已经是有序的了,所以只用再c归并,d树状数组求和。代码://四维偏序模板题,求ai<aj,bi<bj,ci<cj,di<dj的对数const int N = 1...原创 2018-09-19 21:22:01 · 614 阅读 · 0 评论 -
CDQ分治
cdq分治一般是解决具有一下两种性质的问题(只有修改和查询操作):1.只能用离线做法。2.每个修改操作对询问的影响是独立的,即与之前的修改操作无关。cdq分治与一般的分治不同,一般的分治分出来的子区间是独立的,个个击破即可,而cdq分治分出来的两个子区间是相互联系的。(以下的分治都是指cdq分治)由于在该问题中,每个询问只与在此之前的修改操作有关。对于区间l,mid,记为区间1,区间m...原创 2018-09-12 19:38:01 · 296 阅读 · 0 评论 -
后缀数组模板
后缀数组真难,QAQ自己写了一个,找了两份模板主流两种算法:倍增法(时间O(NlogN),空间O(N))DC3算法(( 时间复杂度O(N),空间复杂度O(3N) )) 倍增(DA)算法1:const int MAXN = 1e5+5;int SA[MAXN], rank[MAXN], Height[MAXN];int tax[MAXN], tp[MAXN], a...原创 2018-08-24 20:06:36 · 396 阅读 · 0 评论 -
九大排序-基数排序
基数排序://基数排序(Radix Sort)基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。//具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。//然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。/*时间复杂度:O(N*digit)空间复杂度:O(N)稳定性:稳定*/cons...原创 2018-08-24 16:33:08 · 282 阅读 · 0 评论 -
马拉车算法(Manacher算法求最长回文子串)
马拉车有两个规律:最长子串的长度是半径(p数组)减1,起始位置是中间位置减去半径再除以2。模板:const int N = 110005;char str[N],s[N*2];int p[N*2],len1,len2; //p[i]表示以t[i]字符为中心的回文子串的半径/*s[i]: # 1 # 2 # 2 # 1 # 2 # 2 #p[i]: 1 2 1 2 5 2 ...原创 2018-08-22 15:51:12 · 494 阅读 · 1 评论 -
拓扑排序模板(Kahn算法和DFS实现)
拓扑排序思想:每次取出入度为0的顶点删掉,并删掉和该点有关的边,需要维护一个入度为0的队列或者栈模板:int n,m;int inDeg[N]; //i点的入度vector<int>vec[N]; //i点的邻接表,即i与哪些点相连int ans[N]; //排序结果数组int topSort() //返回值代表是否有环,排序结果在ans数组{ in...原创 2018-05-18 19:59:57 · 1870 阅读 · 1 评论 -
字符串Hash(可处理一些字符串问题)
字符串Hash模板://使用 hash[i]=(hash[i-1]*p+idx(s[i]))%mod 求得前缀为i的hash值,//利用 hash[l..r]=(hash[r]-hash[l-1]*(p^(r-1+1)))%mod 求得s[l,r]的hash值.//(注意l=0的问题,以及hash[l..r] < 0时要 +mod)const ll p = 1e7+9;const l...原创 2018-05-18 17:33:18 · 699 阅读 · 0 评论 -
高精度算法(大数四则运算)
1.大数加法string Add(string a,string b){ string c; int len1=a.length(); int len2=b.length(); int len=max(len1,len2); for(int i=len1;i<len;i++) a="0"+a; //在前面加0 for(int原创 2018-01-16 21:48:19 · 1928 阅读 · 0 评论 -
最短路算法(Floyd算法,Dijkstra算法,Bellman-Ford算法,SPFA算法)
1.Floyd算法//1.Floyd算法,多源无负权//通过邻接矩阵跑出所有点之间的最短路,时间复杂度O(n^3),空间复杂度O(n^2)//d[i][j]表示i到j的最短路径长度,初始化:d[i][i]=0,点到点有路按正常权值初始化,其余INFint mp[n][n];int d[n][n];void Floyd(){ for(int i=1;i<=n;i++)原创 2018-01-31 15:41:56 · 805 阅读 · 0 评论 -
威佐夫博弈
威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,k=0,1,2,原创 2017-03-17 21:10:22 · 299 阅读 · 0 评论 -
除法逆元
除法逆元可求(a/b)%mod也就等于(a%mod)*(inv(b))%mod (inv(b)就是b的逆元)inv(b) = (b^(mod-2))%mod (可用快速幂求解)证明可查看一下博客,写得非常不错,还有更多的逆元求解方法博客传送门:点击打开链接-------------华丽的分割线-------------2018.5.3总结一下几种求逆元的方法//...原创 2017-09-03 15:11:05 · 759 阅读 · 0 评论 -
并查集模板
并查集:在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。初始化把每个点所在集合初始化为其自身。通常来说,这个步骤在每次使用该数据结构时只需要执行一次,无论何种实现方式,时间复杂度均为O(N)。查找:查找元素所在的集合,即根节点。原创 2017-12-19 21:38:29 · 150 阅读 · 0 评论 -
矩阵快速幂模板
矩阵快速幂模板,可用于求一个递推表达式的f(n) 重载运算符版: #include<stdio.h>#include<string.h>#include<math.h>#include<string.h>#include<stdlib.h>#include<algorithm>#includ...原创 2017-08-22 14:02:58 · 303 阅读 · 0 评论 -
简单快速幂
简单快速幂模板//直接快速幂,计算a的b次方对c求余 ll qpow(ll a,ll b,ll c) //转化为二进制进行快速运算{ ll ans = 1; while(b) { if(b&1) //相当于b%2==1 ans = (ans*a)%c; a = (a*a)%c; b&g...原创 2017-08-21 21:39:38 · 265 阅读 · 0 评论 -
数位dp模板
数位dp是一种计数的dp,一般统计满足区间【L,R】内满足条件的一些数的个数,数位就是对一个数的每一位进行dp,即个位,十位,百位。。。数的每一位。一般当数据比较大时就可考虑数位dp,一般是枚举区间【1,R】减去区间【1,L-1】得。下面就是一个简单的基础模板。#include<bits/stdc++.h> using namespace std; in...原创 2017-08-20 10:55:28 · 445 阅读 · 0 评论 -
BFS
#include #include #include using namespace std;struct node{ int x,y,step;};char map[105][105];int vis[105][105];int to[4][2]= {1,0,-1,0,0,1,0,-1};int n,m,sx,sy,ex,ey,ans;int check(in原创 2017-08-19 21:36:24 · 261 阅读 · 0 评论 -
简单博弈——巴什博弈
巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果原创 2017-03-17 20:51:46 · 550 阅读 · 0 评论 -
几种线性DP(最长上升子序列,最长公共子序列等)
1.最长上升子序列//最长上升子序列,O(n^2)算法for(int i=1;i<=n;i++){ scanf("%d",&a[i]); dp[i]=1;}int ans=0;for(int i=1;i<=n;i++){ for(int j=1;j<i;j++) { if(a[i]>a[j]) //严格 d原创 2018-01-19 17:03:33 · 279 阅读 · 0 评论 -
欧几里得算法(辗转相除法 )以及扩展欧几里得算法
简单模板://简单gcd,求a,b最大公约数ll gcd(ll a,ll b){ if(b==0) return a; return gcd(b,a%b);}//扩展欧几里得算法//可求解ax+by=c方程组的一组解,前提是c%gcd(a,b)==0void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y) //d为在最后算原创 2017-09-02 14:23:29 · 584 阅读 · 0 评论 -
素数筛(埃拉托斯特尼筛法,欧拉筛,米勒拉宾素数测试,区间筛)
1.埃拉托斯特尼筛法.//得到自然数n以内的全部素数,依次的所有素数剔除素数的倍数,剩下的就是素数。//复杂度:O(nloglogn)int prime[N]; //第i个素数是prime[i],从0开始记录bool is_prime[N]; //is_prime[i]为true代表i是素数int sieve(int n) //筛出小于等于n的所有素数并返回个数{原创 2018-01-20 19:33:46 · 842 阅读 · 0 评论 -
一维树状数组几种模板
树状数组模板,单点更新,区间查询://树状数组存取、查询log(n),区间求和问题int n,tree[N]; //tree数组按二进制存,根据n的末尾0的个数存取int lowbit(int x){ return x&(-x);}int Query(int x) //返回1到x的前缀和{ int res=0; while(x) {...原创 2018-05-05 17:43:25 · 204 阅读 · 0 评论 -
Sparse Table(ST表)
ST表模板//ST表预处理O(nlogn),查询O(1),但不支持在线修改//dp [ i, j ]表示[ i, i+2^j-1]这个区间内的最值//把dp [i,j]平均分成两段(因为dp [ i,j ]一定是偶数个数字)。//从 i 到i + 2 ^ (j - 1) - 1为一段,i + 2 ^ (j - 1)到i + 2 ^ j - 1为一段(长度都为2 ^ (j - 1))。int...原创 2018-05-05 15:52:55 · 253 阅读 · 0 评论