题面 对 \(n\) 个串建广义 SAM,每个点开一棵线段树维护 parent 树子树内的所有点都被哪些串走到过。这个直接线段树合并即可。注意分裂出来的点也需要update(我也不知道为何,反正不update会WA)。 点击查看代码 const int N=5e5+13,M=5e5+13,logN=21; int pcnt=0; struct SegTree{int
最近公共祖先 LCA dfs向上标记-O(n) 点A先向根搜索并标记,点B再向上搜索,第一次碰到的标记即是lca。 复杂度On,不常用 倍增法-O(logn) dep[i]表示点i的深度 up[i,j]表示从i开始向root方向走2^j步数能走到的位置 若从i开始向根跳2^j次会跳出根则up[i,j]=0,dep[0]=0 具体过程: 【1】先让
A. Parsa's Humongous Tree_基础树形dp 题目大意 每一个点可以选择[li,ri]中任意整数作为权值,一条边的权值是两点权值之差的绝对值。问整棵树的权值和最大是多少。 思路和代码 哎,当时转移方程我都写好了,脑袋没转过弯来。 首先,做几个样例可以得出每个点的权值必取最大或者最小。 我
题目链接:https://vjudge.net/problem/HDU-2087 居然WA #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int nxt[1010]; void get_nxt(char t[]){ int j=0, k=-1; nxt[0]=-1; int tlen=strlen
一.基础DP: 一般的DP的步骤: 1.定义状态:找通解 (1)关注题目需要的东西 (2)状态确定,输出就确定 (3)将状态的准确描述记录下来 2.寻找状态转移方程:描述一个子问题如何用更小的子问题得到 3.确定边界条件:最小的子问题或不满足状态转移方程的状态 典型例题 例一 P1077 摆花 设 \(dp_{i,j}\) 表
link 本来想打一个树上主席树放松一下大脑,结果血压上来了。 其实说白了它就是一个模板,只是有一件事是需要格外留意的: 树上差分点权应该是 \(v(s1)+v(s2)-v(lca)-v(fa(lca))\) ,而树上边权差分应该是(下放到点权之后) \(v(s1)+v(s2)-v(lca)\times2\) 。二者是不一样的,一定要记清楚了!!!
(所以这题为什么叫388535 题意:有一个[l,r]的排列,现在将里面每个数和x异或,得到一个新的数组,现在把这个数组打乱后给你,让你求x。 解0.5:数字的个数是奇数的时候可以把所有数异或一边,排列消掉,剩下的就是x;是偶数的时候按位看,如果相同的一位上0的数量和原来不一致,说明x对应的一位为1。 ha
1.采药&4.开心的金明 我想把这2题放在一起来说,因为都和背包DP很像。 (应该没什么多的知识点) 用时大概每题8分钟。 2.钓鱼 这个题我一开始按照背包的模板来做,即两种向下推的方式 f[i][j]表示在i号池塘第j分钟钓到鱼的最大值 则f[i][j] = max(f[i-1][j-nxt[i-1]] , f[i][j-st]+num
link 可持久化Trie初学笔记。今天写可持久化数据结构都写烦了。 可持久化Trie长得和主席树颇有几分神似,都是一排根节点然后下面一堆纵横交错的边相互连接(也是,可持久化数据结构的功能注定了它们只能长成这幅模样)。 说回本题。为了实现可持久化,考虑加入一个字符串可能会对Trie造成什
C. Shinju and the Lost Permutation 题目大意: 这题目题意贼绕 给一个1~n的排列p,根据p做数列b,bi表示p1~pi中的最大值。b数列中不同的数值数量就是排列p的力量。 现在给出数列c,ci表示p向左循环右移i-1位所得到的力量值。问给出的c有没有可能被一种p得到。 思路和代码: 需要做几组数
题意: 如果一个字符串的子串出现的次数大于任何子串出现的次数,那么这个子串就是 \(\text{most frequent}\)。 给 n 个 \(\text{most frequent}\) 子串,问最短的原串。 如果有多个最短原串,取字典序最小的那个。没有就输出 NO。 思路: https://www.cnblogs.com/CQzhangyu/p/8052899.htm
link Description 一个长度为 \(n\) 的字符串,每次可以将 aa 变为 b,也可以将 bb 变为 a,问最后能变到的不同字符串个数。 \(n\le 10^5\) Solution 可以看出的是我们将 a/b 的权值设为 1/2,那么每次操作在 \(\% 3\) 意义下和并不会改变,那么考虑一个字符串 s 能否变为一个字符串 t,可以
[TOC] 前言 开这个坑的目的是巩固一下字符串的基础内容,毕竟自己对这一块的接触还不是很多。 其实字符串算法最大的特点就是 最大化利用已经求出的信息,几乎所有算法都是基于这句话的。 一些定义: \(\operatorname{lcp}\left(i,j\right)\) 为以 \(i\) 开头的后缀和以 \(j\) 开头的后
一、题目描述 二、解题思路 用map模拟这个链表,然后用vis数组去重,用两个vector存答案,一个存去重后的链表,另一个存去重的节点。 三、代码实现 1 #include "bits/stdc++.h" 2 using namespace std; 3 struct node{ 4 string ts; 5 int val; 6 string nxt;
题意 P5072 [Ynoi2015] 盼君勿忘 给定一个长度为 \(n\) 的序列 \(a\) 和 \(m\) 个询问 \(l, r, p\),每次询问 \([l, r]\) 中所有子序列去重后的和 \(\bmod p\) \(1 \leq n, m, a_i \leq 10^5, 1 \leq p \leq 10^9, 1 \leq l \leq r \leq n\) 思路 莫队 + 光速幂。 操作不带修,考虑莫
kmp的思想,保留上一状态,减少递归查找次数:O(m+n) 好比说找一个串的不重复前缀个数,相当于保留上一状态j位置的不重复前缀个数,那向前推进一个字符,判断s[j+1]==s[i],那么在num[j]基础上+1就行,否则回退到nxt[j]判断是否可行,重复即可,因为每一个状态都能保证最优(nxt[]是记录可以有重复的!!) 所
这是一道有难度的倍增题。 因为\(r_{i}-l_{i}+1\)可以直接计算,故只要求出\(\sum_{j=l_{i}}^{r_{i}} dist(x_{i},j)\),就可以回答询问了。 我们设\(farthest(i,j)\)表示从\(i\)出发,走\(j\)步之内最远能到达哪些点。 接下来我们证明一个结论:\(farthest(i,j)=\min_{k=farthest(i,j-1)}
众所周知,期望大部分题目时放在dp里面的 对于期望的题使用的dp一般都倒序进行 为什么呢? 我们在看期望的题时总会出现这么一句话每一个状态将等概率转移给后面的某些点。 而倒序枚举恰好能够满足转移至本点的各个状态所对应的概率相等。 例如本题 点击查看代码 #include<bits/stdc+
题意: 思路:其实很水就二进制枚举一下x是'A'还是'a'即可 不过做题的时候我u->v(选u就会选v)我没有连v'->u,理论上图是含盖必要逻辑的,但是我们要的是含盖所有逻辑,因为要保持2-SAT图的对称性,这是很多问题的前提。 code: #include<bits/stdc++.h> using namespace std; const int N=1
题目传送门 题目大意: 给定一个序列,初始全为0,每次区间赋值为一个数,求最终的序列。 Solution: 观察数据范围,nlog n的时间复杂度无法通过此题,考虑线性做法。 可以将操作离线下来,则每个点第一次被覆盖时即为答案。 那么我们需要一个数据结构,能够帮助我们快速跳过已修改过的点。 这是并
传送门: https://www.luogu.com.cn/problem/P6175 floyd以外无脑暴搜取得伟大胜利(部分得益于数据小 注释小能手又双上线了(天下苦题解不说数组是干什么用的久矣 1 #include<bits/stdc++.h> 2 #define ff(i,s,e) for(int i=s;i<=e;i++) 3 #define fff(i,s,e) for(int i=s;i>=e;i-
直觉告诉我一般情况下,询问古怪的题都是分块,但是这一类题不太一样。 思考一个奇怪的暴力,每次询问的时候询问 \(f(1,k),f(2,k+1),f(3,k+2),...f(n-k+1,n)\),然后加起来一定是答案。 差分,思考 \(f(l+1,r+1)-f(l,r)\) 是多少。容易知道其对答案的贡献为 \((n-r)\)。 考虑 \(l\) 和 \(r+
题目大意 有 n ( 2 ≤ n ≤ 1 0
拉链法的 unordered_map 和你想象中的不一样 根据数组+拉链法的描述,我们很快能想到下面这样的拉链法实现的哈希表,但真的是这样吗?一起看下源码里的实现是怎么样的。 深入STL源码 代码不会骗人的,可以写一个简单的代码研究一下实现,然后通过gdb跟踪执行: #include <vector> #include <
字符串哈希 设一个字符串 \(s\),长度为 \(len\),定义一个大质数 \(base\),那么求哈希的式子为: \[hash(s)=\sum^{len}_ {i=1} s_i \times base^{len-i} \]\(base\) 的次方可以由 \(power\) 数组初始化得到,那么如果把哈希当做一个 \(base\) 进制的数的话,不难想出用哈希数组 \(h\) 维护