ACM模板
juruo_c
研一菜狗 致力于研究各种计算机底层技术
展开
-
树的直径
文章目录两遍dfs树形dp两遍dfsvoid dfs1(int u,int fa){ for(int i = head[u];i;i = e[i].next){ int v = e[i].to; if(v != fa){ dis1[v] = dis1[u] + e[i].w; if(dis1[v] > dis1[st]) st = v; dfs1(v,u); }原创 2021-03-04 20:07:21 · 194 阅读 · 1 评论 -
计算几何初步
终于开始入手计算几何了呀用了一天学了挺多知识了,打了一些模板题比较简单也就不一一列举了这里先放出来一个可能有所错漏的板子会慢慢改动的模板十分简洁!!!#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define db doubleusing namespace std;const int N = 1e原创 2021-02-28 21:28:52 · 84 阅读 · 0 评论 -
回文自动机
详细博客待更~这里先写模板struct PAM_T{ int ch[26],fail,len,num,trans;};struct PAM{ PAM_T b[N]; char s[N]; int cur,n,cnt; PAM(){ b[0].len = 0,b[1].len = -1; b[0].fail = 1,b[1].fail = 0; cnt = 1; cur = 0; }原创 2021-02-26 21:32:22 · 97 阅读 · 0 评论 -
字符串哈希
文章目录自然溢出哈希单模数哈希双模数哈希大数哈希自然溢出哈希typedef unsigned long long ull;ull base = 131;ull hashe(char s[]){ ull ans = 0; int len = strlen(s); for(int i = 0;i < len;i ++) ans = ans * base + (ull) s[i]; return ans & 0x7fffffff;}单模数原创 2021-02-23 21:34:01 · 102 阅读 · 0 评论 -
字符串的最大最小表示法
今天刷到一道kuangbin的题HDU-3374一开始一脸懵逼,看了题解才恍然大悟没错我就是博客的搬运工就是这篇下面上最大最小表示法的模板:int getmin(char s[]){ int i = 0,j = 1, k = 0; int n = strlen(s); while(i < n && j < n && k < n){ int t = s[(i + k) % n] - s[(j + k) % n原创 2021-02-22 20:36:17 · 136 阅读 · 0 评论 -
AC自动机
原理看这:太懒了模板:struct A{ int ch[N][26],val[N],fail[N],cnt; void insert(char s[]){ int len = strlen(s); int u = 0; for(int i = 0;i < len;i ++){ int c = s[i] - 'a'; if(!ch[u][c]) ch[u][c] = ++ cnt;原创 2021-02-16 22:03:29 · 100 阅读 · 0 评论 -
Trie字典树
这个很简单看一道题就可以懂模板题模板代码:#include<cstdio>const int N = 5e5 + 10;char s[60];int n,m,ch[N][26],vis[N],tot = 1;int main(){ scanf("%d",&n); for(int i = 1;i <= n;i ++){ scanf("%s",s + 1); int u = 1; for(int j原创 2021-02-16 22:00:50 · 114 阅读 · 0 评论 -
KMP与扩展KMP
文章目录KMP扩展KMPKMP原理看这:原理orz模板:#include<cstdio>#include<cstring>using namespace std;const int N = 1e6 + 10;int ne[N];int lt,lp;char a[N],b[N];void getnext(){ int j = 0,k = -1; ne[0] = -1; while(j < lp){ if(k == -原创 2021-02-16 21:57:08 · 170 阅读 · 0 评论 -
Manacher算法
用来算回文串的回文半径原理看这里:原理下面直接上模板#include<iostream>#include<cstdio>using namespace std;const int N = 11000002;char s[N << 1];int r[N << 1],cnt;void read(){//预处理字符串,将字符串长度处理成2n + 1 char c = getchar(); cnt = 1; s[0] = '原创 2021-02-16 20:48:11 · 100 阅读 · 0 评论 -
组合数学基础
文章目录抽屉原理容斥原理组合数计算组合数取模抽屉原理经典应用:给出一个含有 n 个数字的序列,找一个连续的子序列,使他们的和是 c 的倍数#include<cstdio>#include<cstring>using namespace std;typedef long long ll;const int N = 1e5 + 10;ll a[N],dr[N];ll sum[N];int main(){ ll c,n; while(~scanf("原创 2021-02-08 09:17:31 · 279 阅读 · 0 评论 -
线段树
文章目录区间加法,区间查询区间乘法与加法结合(先乘后加)区间加法,区间查询#include<iostream>using namespace std;const int N = 1e5 + 10;typedef long long ll;struct tree{ int l,r; ll sum,lz;}t[N << 2];void push_up(int i){ t[i].sum = t[i << 1].sum + t[i <原创 2021-02-04 21:30:52 · 76 阅读 · 0 评论 -
倍增的两个简单应用
文章目录LCA(最近公共祖先)静态RMQ(ST表查询)LCA(最近公共祖先)首先遍历一次预处理void dfs(int now,int fath){ fa[now][0] = fath;dep[now] = dep[fath] + 1; for(int i = 1;i <= lg[dep[now]];i ++){ fa[now][i] = fa[fa[now][i - 1]][i - 1]; } for(int i = head[now];i;i原创 2021-01-31 21:23:10 · 141 阅读 · 0 评论 -
经典排序(待补充~
文章目录快排归并排序桶排序快排void qsort(int a[],int l,int r){ if(l == r) return; int i = l - 1,j = r + 1,m = a[l + r >> 1]; while(i < j){ do i ++;while(a[i] < m); do j --;while(a[j] > m); if(i < j) swap(a[i],a[j])原创 2021-01-21 13:19:59 · 71 阅读 · 0 评论 -
基础数论
文章目录欧拉筛法欧几里得算法扩展欧几里得算法质因数分解乘法逆元因为基础数论每一部分的内容比较少所以就都放一起了欧拉筛法void euler(ll range){ for(ll i = 2;i < range;i ++){ if(!vis[i]) prime[cnt ++] = i; for(int j = 0;j < cnt;j ++){ if(i * prime[j] >= range) break;原创 2021-01-19 13:31:54 · 213 阅读 · 0 评论 -
ACM模板~(持续更新中)
文章目录图论一、最小生成树二、最短路图论一、最小生成树二、最短路原创 2021-01-15 21:09:41 · 207 阅读 · 0 评论 -
高精度加减乘除(非重载运算符
文章目录高精加高精减高精乘高精除高精加string add(string a,string b){ int na[N] = {0},nb[N] = {0}; string res; if(a.size() < b.size()) return add(b,a); int len = max(a.size(), b.size()); for(int i = a.size();i > 0;i --) na[i] = a[a.size() - i] - '0'; for(int i =原创 2021-01-15 21:05:51 · 128 阅读 · 0 评论 -
进制转换(水博)
文章目录正负数都适用的进制转换正负数都适用的进制转换理论依据:余数如果是负数的话就:商 += 1,余数 -= 除数因为余数的绝对值肯定小于除数的绝对值故余数就可以变为正数正确性证明:设被除数为a,除数为b,商为c,余数为d则有c * b + d = a又有( c + 1 ) * b + d - b = c * b + b + d - b = c * b + d所以就可以开心的写代码了呀//将十进制数n转化为m进制数并输出void change(int n,int m){ i原创 2021-01-15 17:01:41 · 112 阅读 · 0 评论 -
三个最简单的最短路模板(待补充~
文章目录FloydDijsktraSPFAFloyd由动态规划思想推导出转移公式再经滚动优化可得void Floyd(){ for(int k = 1;k <= n;k ++) for(int i = 1;i <= n;i ++) for(int j = 1;j <= n;j ++) d[i][j] = min(d[i][j],d[i][k] + d[k][j]);}Dijsktra直接扔代码吧也没啥好说的我习惯用堆优化写struct node{原创 2021-01-15 15:15:15 · 125 阅读 · 0 评论 -
最小生成树(待补充
文章目录一、kruskal(yyds)二、prim朴素写法一、kruskal(yyds)kruskal简单易懂,用并查集维护联通图就行直接扔代码int getf(int x){ return x == fa[x] ? x : fa[x] = getf(fa[x]);}struct edge{ int u,v,w; bool operator < (const edge& b)const { return w < b.w; }}原创 2021-01-15 10:13:32 · 88 阅读 · 0 评论