题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题解: 显然答案一定小于\(n\times n\), 字符串倒过来变成前缀建Trie, 题意转化如下: 每次可以在一棵树上标记一个点,要求标记一个点之前所有祖先都标记过,标记一个点的价值等于它父亲被标记的时间,最大化价值和(也可以是求所有父子标记时间之差的和的最小值) 一看到这个脑子里立刻蹦出一个贪心: 按照儿子个数从小到大选(用堆维护) 然而是错的 hack数据: 10 aa…
[BZOJ4567][Scoi2016]背单词 Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ————— 序号  单词 —————  1  2 …… n-2 n-1  n —————   然后凤老师告诉 Lweb ,我知道你要学习的单词总共有 n 个,现在我们从上往下完成计划表,对于一个序号为 x  的单词(序号 1...x-…
题目链接 大致题意 给你 \(n\) 个字符串, 要求你给出最小的代价. 对于每个字符串: 1.如果它的后缀在它之后,那么代价为 \(n^2\). 2.如果一个字符串没有后缀,那么代价为 \(x\), \(x\)是它所处的位置. 3.如果字符串前面有它的后缀且位置为 \(y\),那么代价为 \(x-y\). Solution 比较鬼畜的体面,出题人语文水平亟需提高... 反向建立一棵 Trie 树. 根据 Trie 树对于每一个被标记过的点重新连边. 考虑贪心 条件1 有它一定不是最优的,显然后…
Description Lweb 面对如山的英语单词,陷入了深深的沉思,"我怎么样才能快点学完,然后去玩三国杀呢?".这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ----- 序号 单词 ----- 1 2 -- n-2 n-1 n ----- 然后凤老师告诉 Lweb ,我知道你要学习的单词总共有 n 个,现在我们从上往下完成计划表,对于一个序号为 x 的单词(序号 1...x-1 都已经被填入): 1) 如果存在一个单词是它的后…
题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: —————序号 单词————— 1 2......n-2n-1 n————— 然后凤老师告诉 Lweb ,我知道你要学习的单词总共有 n 个,现在我们从上往下完成计划表,对于一个序号为 x 的单词(序号 1...x-1 都已经被填入): 1) 如果存在一个单词是它的后缀,并且当前没有被填入表内,那…
4567: [Scoi2016]背单词 https://www.lydsy.com/JudgeOnline/problem.php?id=4567 题意: 题意看了好久,最后在其他人的博客里看懂了的. n个字符串,给它们排一个顺序.花费最小.对于第x个位置字符串的花费如下计算是这样的: 如果存在它的一个后缀单词在它的后面,花费为x*x 如果它的所有后缀单词都在它前面了,花费为x-last_pos(last_pos为它的后缀单词最后一个出现的位置,如果没有则为0). 分析: 贪心 + dfs序.…
1.题意表述十分难以理解,简单说就是:有n个单词,确定一个背的顺序,使总代价最小. 2.因为第(1)种情况的代价是n*n,这个代价比任何一种不出现第(1)种情况的方案都要大,所以最后肯定不会出现“背某个单词的时候它的后缀还没背”的情况. 3.考虑将每个串和单词表中它的最长后缀连边,则形成了一棵树.我们需要给树上每个点分配一个1~n的整数v[]且两两不同(就是背的顺序,要保证儿子分配到的数一定大于父亲).那么总代价就是所有点的v[i]-v[fa[i]].可以发现,要让总代价最小,最终的涂色序列(就…
Brief Description 给你N个互不相同的字符串,记\(S_i\)为第i个字符串,现在要求你指定N个串的出现顺序,我们用\(V_i\)表示第i个字符串是第几个出现的,则V为1到N的一个排列.我们希望你指定的出现顺序可以使总代价最小 一个出现顺序的代价的计算方法如下依次考虑第i个串\(S_i\)对代价的贡献: 假如存在一个串\(S_j\), \(S_j\)为\(S_i\)的后缀: 假如存在一个串\(S_j\), \(S_j\)为\(S_i\)的后缀,且\(V_j>V_i\)则第i个串对…
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1123 Solved: 476[Submit][Status][Discuss] Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ————— 序号  单词 —————  1  2 …… n-2…
P3294 [SCOI2016]背单词 Trie+贪心 倒插进树+取出重建+子树处理+贪心遍历 倒插进树:把后缀转化为前缀,所以把字符串倒着插进Trie中 取出重建:重新建立一棵以单词为节点的树,如果存在包含(前缀)关系就连边 子树处理:处理出每棵树的大小用于贪心 贪心遍历:遍历整棵新树,累加答案 关于贪心:每次找到最小的子树统计答案 end. #include<iostream> #include<cstdio> #include<cstring> #include&…
4567: [Scoi2016]背单词 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 304 Solved: 114 [Submit][Status][Discuss] Description Lweb 面对如山的英语单词,陷入了深深的沉思,"我怎么样才能快点学完,然后去玩三国杀呢?".这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ----- 序号 单词 ----- 1 2 -- n…
[BZOJ3261]最大异或和 Description 给定一个非负整数序列 {a},初始长度为 N.       有   M个操作,有以下两种操作类型:1 .A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1.2 .Q l r x:询问操作,你需要找到一个位置 p,满足 l<=p<=r,使得:a[p] xor a[p+1] xor ... xor a[N] xor x 最大,输出最大是多少. Input 第一行包含两个整数 N  ,M,含义如问题描述所示.   第二行包含 N…
题目链接 BZOJ4567 题解 题意真是鬼畜= = 意思就是说我们应先将一个串的所有后缀都插入之后再插入这个串,产生代价为其到上一个后缀的距离 我们翻转一下串,转化为前缀,就可以建\(trie\)树来解决了 建好\(trie\)后单独取出单词节点,贪心先往子树小的节点编号即可 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<queue…
背单词 https://www.luogu.com.cn/problem/P3294 前言: Trie树的省选题(瑟瑟发抖QAQ) 问题汇总:(请忽略) (1)对Trie字典树的运用不熟练 (2)没想到可以将后缀转换为前缀来解决 (3)对于并查集和vector不知道怎么加到这个程序中 题目简述: PS:这道题话有点多,有点乱,建议借用草稿本理解题意 给你n个互不相同的单词,学习这些单词要按照给定的规则吃泡椒,要求吃的泡椒数最少. 吃泡椒规则:(设当前单词为now,且1~now-1都已经记忆过)…
题目描述 Lweb 面对如山的英语单词,陷入了深深的沉思,”我怎么样才能快点学完,然后去玩三国杀呢?“.这时候睿智的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: —————序号 单词————— 1 2......n-2n-1 n————— 然后凤老师告诉 Lweb ,我知道你要学习的单词总共有 n 个,现在我们从上往下完成计划表,对于一个序号为 x 的单词(序号 1...x-1 都已经被填入): 1) 如果存在一个单词是它的后缀,并且当前没有被填入表内,那…
这是一道贪心题 刚开始yy出来一个比较\(sb\)的贪心 之后发现它错了 首先这道题得先把题面翻译成人话 如果存在一个单词是它的后缀,且当前没被填入,代价为\(n*n\): 如果不存在一个单词是它的后缀,代价为\(x\): 如果存在一个单词是它的后缀,且已填入的是它后缀的单词中序号最大的为\(y\),代价为\(x-y\). 显然如果出现了第一种情况那肯定就凉了,这个花费太大了 显然这是可以避免的,我们在插入一个串之前就必须把它的所有后缀插入 所以这里就需要\(Trie\)树了,我们将所有的串倒着…
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词(每个单词内包含大小写字母).现在他想要找出某一段连续的单词内字典序最大的单词. 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示单词个数和询问个数. 接下来N行每行包含一个字符串,仅包含大小写字母,长度不超过15,表示一个单词. 再接下来M行每行包含两个整数x.y,表示求从第x到第y…
题目链接:http://poj.org/problem?id=3764 分析:好题!武森09年的论文中有道题CowXor,求的是线性结构上的,连续序列的异或最大值,用的办法是先预处理出前n项的异或值,然后在这些值中找出两个值的异或值最大.是基于这样的一个原理,相同段的异或值为0.这题在树中找两个节点,两个节点间有唯一路径(因为是树),把路径不断做异或,异或完后求最大的.数据是10万,O(n2)算法超时.我们知道异或有这样的性质:a^b = (a^c)^(b^c),这样就可以考虑找出a与b公共的c…
阅读理解题 ...... $Trie$ 后缀问题不好处理,我们把它转化为前缀问题,用字典树解决问题 贪心 容易想到,一个串的后缀要先于它插入 对于一个串和其若干后缀串,容易想到,我们要先插入后缀串 然后递归进入$size$最小的子串 bool cmp(const int &x,const int &y) { return size[x]<size[y]; } void makes(int x) { size[x]=; ;i<t[x].size();i++) { makes(t[…
[BZOJ2905]背单词 Description 给定一张包含N个单词的表,每个单词有个价值W.要求从中选出一个子序列使得其中的每个单词是后一个单词的子串,最大化子序列中W的和. Input 第一行一个整数TEST,表示数据组数. 接下来TEST组数据,每组数据第一行为一个整数N. 接下来N行,每行为一个字符串和一个整数W. Output TEST行,每行一个整数,表示W的和的最大值. 数据规模 设字符串的总长度为Len 30.的数据满足,TEST≤5,N≤500,Len≤10^4 100.的…
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61705397 Description 给定一个非负整数序列 {a},初始长度为 N. 有 M个操作,有以下两种操作类型: 1 .A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1. 2 .Q l r x:询问操作,你需要找到一个位置 p,满足 l<=p<=r,使得: a[p] xor a[p+1] xor - xor a[N]…
建出Trie树然后求出一个点子树中有多少笔名和真名.然后贪心匹配即可. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int N=810000; int ans,n; char s[N]; struct trie{ int trans[N][27],tot,si…
[BZOJ4260]Codechef REBXOR Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. Output 输出一行包含给定表达式可能的最大值. Sample Input 5 1 2 3 1 2 Sample Output 6 HINT 满足条件的(l1,r1,l2,r2)有:(1,2,3,3),(1,2,4,5),(3,3,4,5). 对于100%的数据,2 ≤ N ≤ 4*105,0 ≤ Ai ≤ 1…
题目大意:给定n个字符串,对于每一个字符串求以这个字符串为后缀的字符串中第k小的编号 首先将字符串反转 那么就变成了对于每一个字符串求以这个字符串为前缀的字符串中第k小的编号 然后考虑对字符串排序 那么对于每一个字符串以它为前缀的字符串一定是连续的 那么就转化成了区间第k小 这个用可持久化线段树能够解决 排序自然不能直接排 既然是字符串 考虑Trie树+DFS就可以 注意字符串有反复的 小心 #include <vector> #include <cstdio> #include…
思路: 1.找次大值 我们不妨设当前点是次大的 那这段区间为 左边第二个比它大的点的坐标+1 和右边第二个比它大的点的坐标-1 2.用可持久化trie树找异或最大值 也可以用莫队 //By SiriusRen #include <set> #include <cstdio> #include <algorithm> using namespace std; #define N 50050 int n,cnt,f,ch[N*32][2],wei[N*32],root[N]…
题目大意:略 这竟然是$thusc$的题... 先把询问里加入的串全拎出来,建出$Trie$树,$Trie$里每个节点都开一个$vector$记录操作标号,再记录操作数量$sum$ 然后瞎**搞搞就行了 又水了一篇博客 #include <cmath> #include <queue> #include <vector> #include <cstdio> #include <cstring> #include <algorithm>…
题目传送 阅读理解题题意解释可以看这位大佬的博客. 发现求后缀与倒序求前缀是等价的,而找前缀自然就想到了trie树.将所有字符串翻转后再建入trie树中,再对每一个字符串翻转后从trie树中找前缀,就能找到一个字符串的所有后缀了. 由第三种情况知我们要想最小化总代价,则最小化一个字符串与最靠近它的后缀间的距离应该也是一个要考虑的因素.其实一个串最近的后缀其实一定是它的所有后缀中长度最大的,因为它的后缀中长度短的也一定是长度大的后缀,并且还要避免第一种情况的出现(即序列在一个字符串后面的串中不能有…
题目描述 你需要在$[0,2^n)$中选一个整数$x$,接着把$x$依次异或$m$个整数$a_1~a_m$.在你选出$x$后,你的对手需要选择恰好一个时刻(刚选完数时.异或一些数后或是最后),将$x$变为$(\left \lfloor{\frac{2\times x}{2^n}}\right \rfloor \mod 2^n)$你想使$x$最后尽量大,而你的对手会使$x$最后尽量小.你需要求出$x$最后的最大值,以及得到最大值的初值数量. 输入格式 第一行两个整数$n,m$.第二行$m$个整数$…
题目链接 大意 给定\(A,B\)两个数组,让他们进行匹配. 我们称\(A_i\)与\(B_j\)的匹配是稳定的,当且仅当目前所剩元素不存在\(A_x\)或\(B_y\)使得 \(A_i\oplus B_j<A_i\oplus B_y\)或\(A_i\oplus B_j<A_x\oplus B_j\)成立 问所有稳定匹配的情况中\(A_i\oplus B_j\)之和最大的是多少. 思路 考虑找到当前异或和最大的一对\(A_i\oplus B_j\),那么不会存在一个\(A_x\)或\(B_y\…
Description Lweb 面对如山的英语单词,陷入了深深的沉思,“我怎么样才能快点学完,然后去玩三国杀呢?”.这时候睿智 的凤老师从远处飘来,他送给了 Lweb 一本计划册和一大缸泡椒,他的计划册是长这样的: ————— 序号  单词 —————  1  2 …… n-2 n-1  n —————   然后凤老师告诉 Lweb ,我知道你要学习的单词总共有 n 个,现在我们从上往下完成计划表,对于一个序号为 x  的单词(序号 1...x-1 都已经被填入): 1) 如果存在一个单词是它…