
模板
柒月 流火
菜
展开
-
SPFA 邻接表讲解
以 hdu2544 题为例hdu2544普通的存图方法const int maxn=10005;int head[maxn]; //head[u]表示以head为出发点的邻接表表头在数组Node中的位置,开始时所有元素初始化为-1int d[maxn]; //记录起点到个点的最短距离bool vis[maxn]; //标记数组是否进入队列int n,m,cn...原创 2018-09-12 21:59:44 · 449 阅读 · 0 评论 -
HDU - 3746 Cyclic Nacklace KMP next数组应用,求循环节并补全
HDU - 3746 Cyclic Nacklace题意:求最少添加多少个字符使字符串变成由 n (n>=2) 个循环节组成的字符串。思路:这个题需要用到一些与 nxt 数组有关的公式假设字符串长度为 len (代码中为 n )设最小循环节的长度为 m :m = len - nxt[len]设所需补全的字符数为 x :x = m-len%m = m-(len-m)...原创 2019-01-15 21:00:44 · 179 阅读 · 0 评论 -
Manacher 模板 求字符串中的最长回文串的长度
求输入的每一个字符串中的最长回文串的长度1032 : 最长回文子串最长子串的长度是半径减1,起始位置是中间位置减去半径再除以2。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef lo...原创 2019-02-04 14:46:36 · 159 阅读 · 0 评论 -
HDU - 4300 Clairewd’s message 拓展KMP 补齐明文,使明暗文相同
HDU - 4300 Clairewd’s message 题意:给你一个对应的转换表,这个转化表是明文对应的暗文表,也就是第一字母对应‘a’,第二个字母对应‘b’,然后给一个字符串,这个字符串的前一部分是暗文后一部分是明文(将暗文翻译成明文后这两部分字符串其实是一样的),但是后面一部分的明文可能不完整了,但不知道分界线从哪里,要我们打印出完整的暗文+明文思路:先把a全部都当作是...原创 2019-01-23 17:42:05 · 211 阅读 · 1 评论 -
HDU - 3374 String Problem 求字符串的最大最小表示法 并求循环次数
HDU - 3374 String Problem 题意:给你一串字符,这串字符可以左移(将最前面一个字符放到字符串最后面)生成 strlen(s) 个字符串,求出其中字典序最小 和 最大 的字符串在原串的起始位置和出现的次数(如果存在多个最小或最大串,则输出rank值小的,即下标小的那个)。输出:最小字符串起始位置 出现次数 最大字符串起始位置 出现次数思路:...原创 2019-01-30 20:25:58 · 181 阅读 · 0 评论 -
HDU - 1251 统计难题 trie模板 统计前缀个数
HDU - 1251 统计难题 注意输入格式#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn = 1e6+10;int trie[maxn][30],sum[maxn...原创 2019-03-25 16:58:57 · 141 阅读 · 0 评论 -
POJ - 2104 K-th Number 主席树 求区间第 K 小
POJ - 2104 K-th Number 题意:n个数,m次询问,每次输入 l,r,k 。求区间 l,r 中第 k 小的数。主席树讲解:http://www.cnblogs.com/zyf0163/p/4749042.htmlvoid build(int x , int l , int r , int &p)这里的x 就是该元素在原序列中的位置,p它在线段树中的位...原创 2019-04-21 16:52:55 · 162 阅读 · 0 评论 -
【JZOJ 4594】【UVa 12345】Dynamic len 带修莫队
【JZOJ 4594】【UVa 12345】Dynamic len 题意:两种操作: M x y 将 a[x]的值修改为 y ,Q x y 求区间[x,y-1] 有几个不相同的数字。注意题目中的下标从0开始。输入的时候我们从下标 1 开始,修改时需要先将 坐标加1 ,查询时的区间为[++x , y]#include<iostream>#include<...原创 2019-04-17 17:38:31 · 266 阅读 · 0 评论 -
POJ 1986 Distance Queries 倍增求LCA 树上两点之间任意距离
POJ 1986 Distance Queries 题意:有 n 个点,给你 m 条无向边和距离(方向可以忽略),求两点之间的距离由于题目没说,所以不必考虑不连通的情况这道题的题意感觉很迷思路:用 dis 保存点到根节点的距离,两点之间的距离为 dis[x] + dis[y] - 2*dis[lca(x,y)] ;一开始把 head[u] 写成 head[cnt]...原创 2019-04-19 21:28:37 · 607 阅读 · 0 评论 -
HDU - 3294 Girls' research Manacher算法 子串的起点终点公式
HDU - 3294 Girls' research题意:给定一个字母,这个字母对应着真正的 a ,将字符串变为他所对应的字符串,求出这个字符串的最长回文串的起点和终点,并输出这个回文串思路:最长子串的长度是半径减1,起始位置是中间位置减去半径再除以2。Manacher算法+公式,新串中的位置 i ,对应原始串的( (i-len[i])/2 , (i+len[i])/2-2 ...原创 2019-02-06 19:36:28 · 235 阅读 · 0 评论 -
trie 模板
const int maxn = 1e6+10;int tr[maxn][30]; //第二维数组大小视题目要求而定int sum[maxn]; //统计前缀int tot,root;char s[maxn];//bool vis[30*maxn]; //标记节点是否为字符串结尾//int ans;void insert(){ int len = strle...原创 2019-04-24 22:32:29 · 112 阅读 · 0 评论 -
KMP 模板
len%(len - nxt[len])=0 && nxt[len]!=0 循环节公式void getnxt(char *t){ int len = strlen(t); int j,i=0; j = nxt[0] = -1; while(i<len) { if(j==-1 || t[i]==t[...原创 2019-01-25 21:02:12 · 147 阅读 · 0 评论 -
HDU - 2087 剪花布条 KMP查找子串,不能有重叠
HDU - 2087 剪花布条 思路:在查找时每当匹配成功,将 j=0#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=1000010;int nxt[maxn];char a[maxn],b[maxn];int ...原创 2019-01-15 20:13:55 · 137 阅读 · 0 评论 -
HDU - 1686 Oulipo 简单KMP
HDU - 1686 Oulipo题意给定一个单词和一个字符串,求单词在字符串中出现的次数思路将单词当作模式串求 next(文中用 nxt 表示),把包含模式串最后一个字母所对应的前后缀也求出来(如果有n个字符则求到nxt[n]),根据最后的这个 nxt[n] 的值我们将知道与模式串相同的前缀在文本串的下一个位置。AZAAZAZAZAAZA的nxt值为:-1 0 -...原创 2019-01-15 16:58:17 · 334 阅读 · 0 评论 -
逆元模板 与简介
1.费马小定理求逆元(求a对于mod的逆元,要求mod为素数)由费马小定理a^(p-1)≡1, 变形得 a*a^(p-2)≡1(mod p),答案已经很明显了:若a,p互质,因为a*a^(p-2)≡1(mod p)且a*x≡1(mod p),则x=a^(p-2)(mod p),用快速幂可快速求之复杂度O(logn); 适用范围:一般在mod是个素数的时候用,比扩欧快一点而且好写。...原创 2018-09-26 17:49:14 · 273 阅读 · 0 评论 -
线段树 单点修改,区间查询/修改/求和模板
单点修改,区间求和#include<cstdio>const int maxn=50000;int sum[4*maxn]; //求和int node[maxn]; //存原数组下标void pushup(int rt) //更新节点信息 这里是求和{ sum[rt]=sum[rt<<1]+sum[rt<<1|1];} //...原创 2018-10-16 17:23:28 · 468 阅读 · 0 评论 -
Balanced Lineup POJ - 3264 RMQ 裸题 线段树
RMQ#include<cstdio>#include<algorithm>#include<cmath>using namespace std;const int maxn=50010;int maxsum[maxn][20],minsum[maxn][20];void rmq(int n) //预处理{ for(int j=1...原创 2018-10-28 15:35:07 · 154 阅读 · 0 评论 -
Nearest Common Ancestors POJ - 1330 LCA (树上倍增模板)
这是一道模板题树上倍增的写法和应用#include<cstdio>#include<cstring>#include<cmath>#include<queue>using namespace std;const int maxn=10010;vector<int>g[maxn];int fa[maxn][15]; ...原创 2018-10-26 15:54:51 · 219 阅读 · 0 评论 -
How far away ? HDU - 2586 LCA (树上倍增详解)
a,b两点间的距离为 dis[a]+dis[b]-2*dis[lca(a,b)] ,dis为到根节点的距离#include<cstdio>#include<cstring>#include<cmath>#include<queue>using namespace std;const int maxn=40010;struct nod...原创 2018-10-26 21:19:50 · 237 阅读 · 0 评论 -
Cornfields POJ - 2019 二维RMQ 裸题
题意n代表矩阵的大小,b代表要查询矩阵的大小,k代表有多少次询问每次询问给定一个点坐标,以这个坐标为左上角大小为b的矩阵中求最大值和最小值的差#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int dmax[251][251][8][8],dm...原创 2018-10-31 17:14:07 · 228 阅读 · 0 评论 -
Counting Offspring HDU - 3887 简单DFS序+线段树
Counting Offspring HDU - 3887 DFS序讲解DFS序后图题意求每一个点子树中标号比他小的节点数思路用DFS求出每一个点的 in,out ,x点的所有子节点就在in[x]到out[x]之间。建树时以每个点 in[ ]的值对应叶子结点(例如:in[3]=4,则树4~4区间所对应的叶子结点所表示标号的即为3)。查询时因为范围已经确定所以只需按照输出顺序...原创 2018-11-12 21:26:58 · 230 阅读 · 0 评论 -
POJ - 2985 The k-th Largest Group 树状数组 求第k大
题目链接:POJ - 2985 The k-th Largest Group利用树状数组前缀和特性(能求出某个数前边有多少个数比他小),将求第K大的数转换为求第 (num-k+1)小的数 num为数的个数。一开始每个组都只有一只猫,所以一共有n组,此时 c[1]=n (假设 c[ ] 为树状数组),表示只含一只猫的有n组。我们只需要根据原数组 a[ ] (一开始每组只有一只猫所以初始化全...原创 2018-12-12 16:45:01 · 219 阅读 · 0 评论 -
线性筛素数 模板
#include"cstdio"#include"cstring"#include<iostream>using namespace std;#define MAX 10000//求MAX范围内的素数long long su[MAX],cnt;bool isprime[MAX];void prime(){ cnt=1; memset(isprime,1...转载 2018-12-16 16:18:26 · 135 阅读 · 0 评论 -
POJ - 1195 Mobile phones 二维树状数组模板题 (单点修改,区间查询)
POJ - 1195 Mobile phones不会的可以看这篇文章:https://blog.youkuaiyun.com/qq_41837216/article/details/85041511#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int...原创 2018-12-16 22:14:18 · 216 阅读 · 0 评论 -
(一维、二维)树状数组模板
一、一维树状数组一维或二维的区间修改都用到了差分的思想 详细讲解1.单点修改+区间查询int lowbit(int x){ return x&-x;}void add(int x,int v) //给x位置加上v{ while(x<=n) { c[x] += v; x += lowbit(x); ...原创 2018-12-22 12:10:37 · 169 阅读 · 0 评论 -
克鲁斯卡尔 模板
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int maxn = 1e5+10;struct node{ int u,v,w;}e[2*maxn];int fa[maxn]; ...原创 2019-05-15 21:56:50 · 493 阅读 · 0 评论