【[BJOI2017]魔法咒语】】的更多相关文章

P3715 [BJOI2017]魔法咒语 AC自动机+dp+矩阵乘法 常规思路是按基本串建立AC自动机 然鹅这题是按禁忌串建立AC自动机 对后缀是禁忌的点以及它的失配点做上标记$(a[i].ed)$,到时候不访问. 基本串转化为自动机上的边:设$p[j][i]$表示第$j$个节点加上第$i$个串会到的节点编号 在建好AC自动机后可以直接处理. 现在分类讨论(对,两份代码) 1.$L<=100,60pts$ 直接在AC自动机上跑dp 设$f[j][i]$表示到点$j$长度为$i$的方案数 枚举基本…
bzoj 4860   LOJ2180   洛谷P3175 [BJOI2017]魔法咒语 题目描述: Chandra 是一个魔法天才. 从一岁时接受火之教会洗礼之后,Chandra 就显示出对火元素无与伦比的亲和力,轻而易举地学会种种晦涩难解的法术. 这也多亏 Chandra 有着常人难以企及的语言天赋,让她能轻松流利地说出咒语中那些极其拗口的魔法词汇. 直到十四岁,开始学习威力强大的禁咒法术时,Chandra 才遇到了障碍. 根据火之魔法规则,禁咒的构成单位是 N 个基本词汇. 施法时只要凝聚…
Luogu-3250 [BJOI2017]魔法咒语(AC自动机,矩阵快速幂) 题目链接 题解: 多串匹配问题,很容易想到是AC自动机 先构建忌讳词语的AC自动机,构建时顺便记录一下这个点以及它的所有后缀有没有忌讳词语,即对于每个AC自动机上的结点\(x\),\(p[x].p|=p[p[x].f].p\) 然后前半部分分和后半是两道完全不同的题目(滑稽 前60分: 这些部分分的特征是\(L\le 100\) 直接AC自动机上\(dp\)就好了,枚举匹配长度\(i\),当前匹配到的点\(x\),以及…
P3715 [BJOI2017]魔法咒语 用基本词汇组成\(L\)长度的单词,其中不能包含禁忌词汇 用禁忌词汇建强大的\(tire\)图 解决: 分类讨论,\(L<=100\)用普通dp暴力在\(tire\)图上用基本词汇跑,不能包含禁忌词汇 显然,\(L<=10^8\)肯定会超时的,注意到基本词汇的长度\(<=2\),矩阵优化一下 构造矩阵是一个难点,左边的矩阵两部分,我们要把\(dp_{i-2}与dp_{i-1}\)矩乘后达到\(dp_{i-1}与dp_{i}\) 右边的矩阵四部分…
4861: [Beijing2017]魔法咒语 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 217  Solved: 105[Submit][Status][Discuss] Description Chandra 是一个魔法天才. 从一岁时接受火之教会洗礼之后, Chandra 就显示出对火元素无与伦比的亲和力,轻而易举地学会种种晦涩难解 的法术.这也多亏 Chandra 有着常人难以企及的语言天赋,让她能轻松流利地说出咒语中那些极其拗口的魔…
矩阵乘法+\(AC\)自动机 是道很不错的题了 首先是前六十分,就是一个\(AC\)自动机上的套路\(dp\),设\(dp[i][j]\)表示匹配出的长度为\(i\)在自动机上位置为\(j\)的方案数,转移的话就枚举下一个单词选择哪个放到自动机上一波匹配就好了 后面\(40\)分强行变成了另外一道题,\(L\)变成了\(1e8\),一看就是矩乘的复杂度了 但是单词的长度都非常小,于是转移\(dp[i][j]\)的时候只需要从\(dp[i-1][]\)和\(dp[i-2][]\)里转移,发现这非常…
Description Chandra 是一个魔法天才. 从一岁时接受火之教会洗礼之后, Chandra 就显示出对火元素无与伦比的亲和力,轻而易举地学会种种晦涩难解的法术.这也多亏 Chandra 有着常人难以企及的语言天赋,让她能轻松流利地说出咒语中那些极其拗口的魔法词汇. 直到十四岁,开始学习威力强大的禁咒法术时, Chandra 才遇到了障碍. 根据火之魔法规则,禁咒的构成单位是 N 个基本词汇.施法时只要凝聚精神力,说出一段用这些词语组成的长度恰好等于 L 的语言,就能释放威力超乎想象…
最近貌似大家都在搞字符串?很长一段时间都没有写博客了……还是补一补坑吧. 感觉AC自动机真的非常优美了,通过在trie树上建立fail指针可以轻松解决多模匹配的问题.实际上在AC自动机上的匹配可以看做是拿着一个串在上面跑,在固定一个左端点的时候尽量地向右匹配.如果发现实在是匹配不下去了,就向右挪动左端点实现新的匹配(跳转fail指针).基本上根据这一条理解,就可以解决大部分的问题了. AC自动机裸考的不多,除了匹配之外一个较常见的搭配就是和DP结合在一起.但本质上依然是在匹配串,只要根据fail…
(总计:共90题) 3.10~3.16:17题 3.17~3.23:6题 3.24~3.30:17题 3.31~4.6:21题 4.7~4.12:29题 ZJOI&&FJOI(6题) TJOI2016(6题) 六省联考2017(6题) SDOI2016(3题) HNOI2013(6题) CQOI2017(3题) 九省联考2018(3题) 3.10 [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树) [BZOJ4012][HNOI2015]开…
AC自动机构建完成后,某个节点沿着Fail链向上能从长到短走到自己的所有后缀.一般的,遍历主串进行匹配,就是在Trie图上定向移动的过程. 构造(一遍 BFS) void build_AC() { ; ;i<;i++) if(ch[u][i])q[r++]=ch[u][i]; while(l<r) { u=q[l++]; ;i<;i++) if(ch[u][i]) { fail[ch[u][i]]=ch[fail[u]][i]; flag[ch[u][i]]|=flag[fail[ch[…
虽然 NOIp 原地爆炸了,目前进入 AFO 状态,但感觉省选还是要冲一把,所以现在又来开始颓字符串辣 首先先复习一个很早很早就学过但忘记的算法--自动 AC AC自动机. AC 自动机能够在 \(\mathcal O(\sum|s|)\) 的时间内解决多模式串的问题,你可以理解为它把 KMP 放在了 trie 树上. 举个例子,\(S=\{"abc","bcd","cd"\},T="abcdbc"\). 首先建出 trie…
[BJOI2017]开车 直接做要用栈 修改?难以直接维护 统计边的贡献! len*abs(pre)pre表示前缀car-stop 修改时候,整个区间的pre+1或者-1 分块,块内对pre排序并打标记 二分出0的位置,再根据pre的正负和本次是+1,-1,leni贡献+1还是-1的贡献 O(nsqrt(n)logn) #include<bits/stdc++.h> #define reg register int #define il inline #define fi first #def…
题面 [BJOI2017]树的难题 题解 考虑点分治. 对于每个点,将所有边按照颜色排序. 那么只需要考虑如何合并2条链. 有2种情况. 合并路径的接口处2条路径颜色不同 合并路径的接口处2条路径颜色相同 我们分别考虑这2种情况. 维护2棵线段树,分别表示与当前接口颜色不同和颜色相同. 如果我们遍历完了一棵子树,就将这棵子树的答案加入到颜色相同的线段树里面. 如果我们遍历完了一段颜色,就将第2个线段树合并到第一个线段树里面. 当然更新答案要在上面2个操作之前. 只需要对于当前子树的每条路径,在2…
[BJOI2017]树的难题 LG传送门 点分治+线段树合并. 我不会写单调队列,所以就写了好写的线段树. 考虑对于每一个分治中心,把出边按颜色排序,这样就能把颜色相同的子树放在一起处理.用一棵动态开点线段树维护颜色不同的子树的信息,另一棵动态开点线段树维护颜色相同的子树的信息,同时按照题目要求更新答案.当子树颜色变化时,就把第二棵线段树合并到第一棵里面去就好了. 代码实现有点繁琐,我调了很久... #include<cstdio> #include<cctype> #includ…
题意 Chandra 是一个魔法天才.从一岁时接受火之教会洗礼之后, Chandra 就显示出对火元素无与伦比的亲和力,轻而易举地学会种种晦涩难解的法术.这也多亏 Chandra 有着常人难以企及的语言天赋,让她能轻松流利地说出咒语中那些极其拗口的魔法词汇.直到十四岁,开始学习威力强大的禁咒法术时, Chandra 才遇到了障碍.根据火之魔法规则,禁咒的构成单位是 N 个基本词汇.施法时只要凝聚精神力,说出一段用这些词语组成的长度恰好等于 L 的语言,就能释放威力超乎想象的火法术.过去的魔法师们…
[BZOJ4861][Beijing2017]魔法咒语 题意:别看BZ的题面了,去看LOJ的题面吧~ 题解:显然,数据范围明显的分成了两部分:一个是L很小,每个基本词汇长度未知:一个是L很大,每个基本词汇的长度是1或2.看来只能写两份代码了. 对于L很小的,我们先将禁忌串建成一个AC自动机,然后预处理出to[i][j]表示AC自动机中的第i个节点在加入基本词汇j后会到达的节点.然后设f[i][j]表示总长度为i,匹配到第j个节点的方案数.然后DP一下就好了. 对于L很大的,我们想到矩乘,设ans…
题目描述 给你一棵 n 个点的无根树. 树上的每条边具有颜色.一共有 m 种颜色,编号为 1 到 m.第 i 种颜色的权值为 ci. 对于一条树上的简单路径,路径上经过的所有边按顺序组成一个颜色序列,序列可以划 分成若干个相同颜色段.定义路径权值为颜色序列上每个同颜色段的颜色权值之和. 请你计算,经过边数在 l 到 r 之间的所有简单路径中,路径权值的最大值. 题解 如果没有颜色这种东西的话,看到l~r的限制,就容易想到点分治+单调队列维护. 我们的单调队列的作用其实就是合并两颗子树. 考虑有如…
传送门 只会线段树……关于单调队列的解法可以去看“重建计划”一题. 看到路径长度$\in [L,R]$考虑点分治.可以知道,在当前分治中心向其他点的路径中,始边(也就是分治中心到对应子树的根的那一条边)颜色相同的两条路径在拼合的时候在加上两条路径的权值之后需要减掉始边颜色的权值(因为被计算了两次),而初始边颜色不同的进行拼合就直接将两条路径的权值加起来即可.我们考虑分开维护这两种拼合. 在每一个分治中心里,我们对其引出的边按照颜色排序(目的是使得始边颜色相同的若干子树放在一起统一遍历),维护两个…
题解 遇见平方和就转有序对呗 dp类似从很多点出发每次走一步的转移方式 然后我too naive的,枚举路径长度来决定更新次数,愉快TLE 改成记搜就过了 代码 #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define enter putchar('\n') #defin…
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法]AC自动机+DP+矩阵快速幂 [题解]其实题意的数据范围不太清晰,反正开200个点就足够了. 因为要匹配禁忌串,所以对禁忌串集合建立AC自动机,标记禁忌串结尾节点,以及下传到所有能fail到的点(这些点访问到都相当于匹配了禁忌串). 令f[i][j]表示匹配到节点i,长度为j的串的数量,先预处理a[i][j…
以后传数组绝对用指针... 考虑点分治 在点分的时候,把相同的颜色的在一起合并 之后,把不同颜色依次合并 我们可以用单调队列做到单次合并$O(n + m)$ 如果我们按照深度大小来合并,那么由于每次都是把大的往小的去合并 因此,合并$n$的序列最多需要$2n$的势能 因此,最终我们就能达到$O(n \log n)$的统计复杂度 然而还有排序,所以实际复杂度$O(n \log^2 n)$,排序常数很小,自然能过 #include <set> #include <vector> #in…
4859: [BeiJing2017]机动训练 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 105  Solved: 63[Submit][Status][Discuss] Description AM 4:45 又是晴朗的好天气. AM 5:00 不要嘛,再睡一会 AM 5:05 呜……欺负人 —————————————————— 睡眼朦胧的菜酱(?)已经被二爷拉起来晨跑了.而这个时间你在做什么呢?咳咳,言归正传,最近菜酱的训练遇到 了点小麻…
题目大意 有一棵树,\(n\)(\(n\leq2*10^5\))个点,每条边\(i\)有颜色\(w_i\),共有\(m\)(\(m\leq n\))种颜色,第\(i\)种颜色的权值是\(c_i\)(\(|c_i|\leq10^4\)) 定义一条路径的权值是该路径上所有同色段的颜色的权值之和 给定\(l,r\),求边数在\([l,r]\)中权值最大的路径的权值 题解 将每个点的所有边按颜色排序后,对这棵树进行点分治,每次统计过当前重心的路径 用线段树统计应该挺板的吧 有人用单调队列做,然而我不会,…
这个题简直神仙,求相同路径的平方就等于两个人走相同路径的方案数.然后...暴力搜索+记忆化就行了,比较玄学. 题干: 题目描述 整个岛可以看作一片 n*m 的区域,每个格子有自己的地形. 一条路径由一系列八连通的格子组成,两个格子八连通当且仅当这两个格子拥有公共的 顶点. 定义一条“机动路径”如下: .它是一条不自交的路径,即路径上任意两个格子都不是同一个 .它的起点和终点处于不同位置,换言之这条路径至少包含 个格子 .从起点开始,任何一步只能向不远离终点的方向移动,这里不远离指的是 x 和 y…
落谷.Loj. Description 定义机动路径为: 没有自环 路径至少包含两个格子 从起点开始每一步都向不远离终点的方向移动 相同地形序列指路径上顺序经过的地形序列. 定义机动路径的权值为相同地形序列的数量之和. 求所有机动路径的权值之和. Solution 同一类机动路径,他的贡献就是数量的平方 \(\Leftrightarrow\) 答案即本质不同机动路径数量的平方和 \(\Leftrightarrow\) 即两个人走的机动路径形式相同的方案总和. 由于 从起点开始每一步都向不远离终点…
题目链接. Description 维护一个序列,支持操作: 每次在 \(P_i\) 位置后插入一段 \(X_i\) 单位的燃料,这一段有三个模式,对应的能量分别是 \(A_i, B_i, C_i\).然后将这个序列分成四段(一段可以为空),权值分别是 \(ABCA\),最后求最大总能量. Solution 首先我们发现一个性质,就是说一段其实在最优解下的状态是相同的,否则可以把状态价值高的蔓延到低的,会更优. 如果不考虑查询,可以把每一段看做一个大小为 \(X_i\) 的点,这个插入操作在时间…
题目描述 题目传送门 分析 路径问题考虑点分治 对于一个分治中心,我们可以很容易地得到从它开始的一条路径的价值和长度 问题就是如何将不同的路径合并 很显然,对于同一个子树中的所有路径,它们起始的颜色是相同的 因此我们可以将一个节点的所有子结点按照颜色排序 这个可以在建图之前处理好 然后开两个权值线段树,一棵存储与当前节点起始颜色相同的所有路径,另一棵存储不同的所有路径 当节点的颜色改变时,把相同的那一堆合并到另一堆即可 时间复杂度 \(nlog^2n\) 代码 #include<cstdio>…
题目传送门 题目大意 有\(n\)个汽车和\(n\)个加油站,坐标分别为\(a_{1,2,...,n}\)和\(b_{1,2,...,n}\).每辆汽车会到一个加油站,求出最小移动距离之和.有\(m\)次修改,每次将某辆汽车的坐标进行修改,求出修改后的最小移动距离之和. \(n,m\le 5\times 10^4\) 思路 看到题解都写得比较繁杂,这里提供一种不是那么繁杂的方法.借鉴了Miracle的博客和shadowice1984的题解. 首先,不难看出对于某一条边,它的贡献为它的长度乘上\(…
洛谷题面传送门 咦?鸽子 tzc 竟然来补题解了?incredible( 首先看到这样类似于路径统计的问题我们可以非常自然地想到点分治.每次我们找出每个连通块的重心 \(x\) 然后以 \(x\) 为根 DFS 一遍整个子树,我们假设 \(y\) 到 \(x\) 的距离为 \(dep_y\),\(x\to y\) 这一段上颜色的权值之和为 \(sum_y\),那么考虑怎样合并两条路径.显然对于两个在 \(x\) 不同子树内的点 \(y,z\),\(y\to z\) 路径上边的个数就是 \(dep…
BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难题 啥也不会,暴力点分治. 点分治的时候只有相同颜色的链合并到一起的时候会出事. 一开始以为权值非负,于是胡了个假做法-- 把边按颜色排序,每次处理一整段的相同颜色,分两棵线段树维护其他颜色/当前颜色的最大权值,然后就没了. 单调队列神仙做法不会-- 代码 LOJ #2180. 「BJOI2017」…