03 2022 档案
乘法逆元
摘要:a/b % m 如果b,m互质,求解同余方程b*x=1(mod m); 如果b,m互质,并且b<m,b^(m-2) 即为b的乘法逆元,用快速幂power求解 求多个数的乘法逆元,用递推公式, inv[1] = 1; for(int i = 2; i < p; ++ i) inv[i] = (p -
阅读全文
LIS最长上升子序列
摘要:首先需要知道,子串和子序列的概念,我们以字符子串和字符子序列为例,更为形象,也能顺带着理解字符的子串和子序列: (1)字符子串指的是字符串中连续的n个字符,如abcdefg中,ab,cde,fg等都属于它的字串。 (2)字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符,即可以去掉字符串中的
阅读全文
Sudoku(数独)
摘要:每个状态下,选择”能填的合法数字“最少的位置,考虑该位置上填什么数,作为搜索的分分支,而不是任意找出一个位置。 数独可以转化为精准覆盖问题,使用一种叫作Dancing Links的数据结构求解。
阅读全文
树与图的广度优先遍历,拓扑排序
摘要:拓扑排序 有向无环图 若序列A满足,每条边(x,y),x在A中都出现在y之前,A就是有向无环图顶点的一个拓扑序 add 结合位运算bitset状态压缩,可记录每条边分别和哪条边连接,结合拓扑排序得出来的序列,减少时间复杂度。
阅读全文
树的深度
摘要:v[x]=1; for(int i=head[x]; i; i=next[i]) { int y=ver[i]; if(v[y]) continue; d[y]=d[x]+1;//从父节点x到节点y递推,计算深度 dfs(y); }
阅读全文
Trie(字典树)
摘要:int trie[SIZE][26],tot=1; void insert(char* str) { int len=strlen(str),p=1; for(int k=0; k<len; k++) { int ch=str[k]-'a'; if(trie[p][ch]==0) trie[p][c
阅读全文
最小表示法
摘要:char s[N * 2]; scanf("%s", s + 1); int n = strlen(s + 1); for(int i = 1; i <= n; i++) s[i + n] = s[i]; int i = 1, j = 2, k; while(i <= n && j <= n) {
阅读全文
KMP匹配模式
摘要:一维 KMP算法next数组的求法 初始化 nxt[1]=0; for(int i=2,j=0;i<=n;i++){ while(j>0&&a[i]!=a[j+1]) j=nxt[j]; if(a[i]==a[j+1]) j++; nxt[i]=j; } KMP算法f数组的求法 for(int i=
阅读全文
字符串Hash
摘要:一维字符串Hash unsigned long long f[N],p[N];//字符串前缀哈希值;p进制,一般取131,13331; unsigned long long get_hash(int l,int r) { return f[r]-f[l-1]*p[r-l+1]; } p[0]=1;
阅读全文
单调队列
摘要:1 int l=1,r=1; 2 q[1]=0; 3 for(int i=1; i<=n; i++) { 4 while(l<=r&&q[l]<i-m) l++; 5 ans=max(ans,sum[i]-sum[q[l]]); 6 while(l<=r&&sum[q[r]]>=sum[i]) r-
阅读全文