首页 > 其他分享 >提高组字符串专题做题记录

提高组字符串专题做题记录

时间:2024-11-22 17:40:27浏览次数:1  
标签:专题 前缀 记录 复杂度 区间 异或 字符串 考虑 log

提高组字符串专题做题记录

A [NOIP2020] 字符串匹配

考虑枚举循环节长度和循环次数,利用哈希判断合法,然后我们就可以求出 \(f(C)\) 了。此时我们需要在前 \(i\) 个前缀中找出满足 \(f(A)\le f(C)\) 的前缀有多少个,看上去可以用树状数组简单维护出来,但实际上由于 \(f(S)\) 的值最多只有 \(27\) 种,因此暴力修改前缀和的复杂度反而更优。使用树状数组复杂度为 \(O(n\ln n\log n)\),而暴力前缀和的复杂度是 \(O(n(\ln n+27))\)。

B [CF965E] Short Code

看到前缀直接考虑 Trie 树,然后不难发现题目的要求相当于是给定树上一些点,可以将某些点挪到它的祖先,但是点的位置不能重复,求最后每个点放置位置的深度之和最小值。

考虑用堆维护出当前节点子树内点的深度,如果当前点没有点,那么就将子树中深度最大的点换过来。向上传递的时候可以考虑启发式合并,继承重儿子的堆。时间复杂度 \(O(n\log^2 n)\)。

C 串串题

考虑先将 \(A\) 中所有没有在 \(B\) 中出现过的数删掉,然后跑 KMP,即可求出 \(B\) 每一次出现只能在 \(A\) 的那些区间出现。然后考虑一个区间,这个区间中会出现一些不在 \(B\) 中出现的数字,我们只要将它们删去即可。考虑拆贡献,我们可以算出选出的数包含区间中这些数的方案数,那么这个区间会给这些方案贡献 \(1\) 的答案。组合数计算即可。

现在的问题就是求出一个区间中出现的数的种类,显然可以用莫队求解。由于我们的区间保证了左右端点均递增,因此这个莫队实际上就是双指针,复杂度 \(O(n)\)。

D [COCI 2016-2017 #1] Cezar

考虑求出最后得到的序列,然后比较相邻两个字符串,找到它们第一个不同的字符。假设是 \(c_1,c_2\),那么意味着 \(c_1\) 在密钥中的权值小于 \(c_2\) 在密钥中的权值。因此连边 \(c_1\to c_2\)。接下来拓扑排序,按照拓扑序为每一个字符分配权值即可,有环则说明无解。

E [CSP-S 2023] 消消乐

考虑我们从左往右走,维护一个栈序列。每一次和栈顶元素比较,如果相同就弹栈,否则压入当前字符。我们对整个栈序列进行哈希,如果当前位置 \(i\) 求出的栈序列在之前的 \(j\) 就被求出过,那么就说明 \((j,i]\) 是一个合法的子串。用 map 存储下每一种哈希值的数量并统计答案即可。

^F [CSP-S 2022] 星战

不可以,总司令!

考虑到原题中的限制条件等价于图是一张内向基环树森林,因此本质上只需要保证每个点出度为 \(1\) 即可。考虑出度并不好维护,但是入度容易维护出来。并且我们知道入度等于出度,所以入度满足条件是出度满足条件的必要条件,但并不充分。

考虑使用哈希使得条件充分的概率尽可能大。我们对每一个点随机赋权值 \(w\),对每个点维护连向它的点的权值之和 \(s\)。那么所有点出度为 \(1\) 就意味着 \(s\) 之和恰为 \(w\) 之和。由于哈希的随机性,其有很大概率可以满足条件充分,可以通过。复杂度 \(O(n)\)。

^G [CF1777F] Comfortably Numb

首先将区间异或和转化为两个前缀异或和的异或。然后考虑建立笛卡尔树。这样我们处理一个区间的时候就可以直接确定最大值所在位置,我们只需要从左右两边各选出一个前缀异或和求最大值即可。

我们考虑枚举一边选的位置,然后只需要在另一边找出异或 \(s_x\oplus mx\) 最大的一个 \(s_y\),显然使用 01-Trie。然后我们将两边的 01-Trie 合并起来上传即可。但是直接做的复杂度最坏是 \(O(n^2\log V)\) 的,考虑启发式合并,每次枚举长度较小的区间,合并较小的 01-Trie,这样的复杂度就是 \(O(n\log n\log V)\) 了。

^H [CF1771F] Hossam and Range Minimum Query

考虑到题目要求在线,因此不能使用莫队求解。

考虑到有数字出现奇数次意味着区间内异或和不为 \(0\),这是数字出现奇数次的必要条件,但不充分。和 F 题一致,我们给每一种数字赋上随机权值,然后再进行异或,此时这个条件的充分性概率就大大提高。

考虑怎样求出最小的满足条件的数。考虑使用主席树,在主席树上的每一段区间 \([l,r]\) 维护该值域区间内所有数对应随机权值的异或和。查询的时候在主席树上二分,如果左区间异或和不为 \(0\) 就递归左区间,否则递归右区间。复杂度即为主席树复杂度,为 \(O(n\log n)\)。

标签:专题,前缀,记录,复杂度,区间,异或,字符串,考虑,log
From: https://www.cnblogs.com/UKE-Automation/p/18563345

相关文章

  • 记录---前端中断请求的方式与原理
    ......
  • 【Linux工作记录】 grafana面板添加clickhouse数据源
    登录grafana的ui界面中添加clickhouse数据源发现没有找到clickhouse数据源操作步骤:1、到grafana节点机器中,找到grafana的bin目录2、安装clickhouse数据源插件./grafanaclipluginsinstallgrafana-clickhouse-datasourceError:✗pluginsDir(/var/lib/grafana/plugins)......
  • [题解]P1641 生成字符串
    P1641[SCOI2010]生成字符串由题意可设\(f[i][j]\)表示用了\(i\)个\(0\),\(j\)个\(1\)的答案,那么有转移:\[f[i][j]=\begin{cases}0&i>j\\f[i][j-1]&i=j\\f[i-1][j]+f[i][j-1]&i<j\\\end{cases}\]状态数是\(O(n^2)\),转移是\(O(1)\),总时间复杂度\(O(n^2)\),期望得......
  • 专题五:知识产权与标准化
    知识产权概括从所涉及的法律法规角度著作权法计算机软件保护条例商标法专利法从试题考点分布的角度保护期限专利权:知识产权人确定工业品外观设计权:商标权:侵权判断保护期限问题客体类型权利类型保护期限公民作品署名权、修改权、保护作品完整权没有限制发......
  • 泷羽Sec学习笔记:shell(2)永久环境变量和字符串显位
    学习笔记:shell编程(2)永久环境变量和字符串显位_哔哩哔哩_bilibili永久变量:echo$PATH 查看环境变量echo$HOME  家目录root用户我们使用的ls、dir命令能输出内容就是因为这些命令都有相对应的变量。which--als  查看ls命令的脚本路径查看echo$PATH:/usr/l......
  • C语言字符串处理相关函数
    作用:处理字符串,如计算字符串长度,查找字符串中指定的字符或字符串,切割字符串等头文件:string.h相关函数:strlen作用:测量字符串长度语法:size_tstrlen(constchar*s);    参数:s:要测量的字符串的首地址    返回值:测量的字符串串长度注意:不包含......
  • 初学STM32记录
    一、硬件准备1.物品采购(1)STM32F103C6T6最小系统板(2)STLink仿真器(一般会随机赠送几条母对母杜邦线,若没有请购买)(3)一台计算机2.线路连接(1)将STM32系统板的VCC3V3、SWDIO、SWDCLK、GND这几个端口通过杜邦线连接到仿真器对应端口。(2)调试时将仿真器USB接口插入......
  • 洛谷 P1841 [JSOI2007] 重要的城市 做题记录
    前置芝士:floyd,组合数学思路因为要所有点的距离不变,所以我们需要一个全源最短路算法,理所当然的用上了floyd(下文循环顺序默认为\(k,i,j\))。我们在记录最短路长度的时候,同时记录最短路的数量\(sum\)。最后我们枚举所有三个点组成的三元组,如果有\(i\tok\toj\)的最短路,且有......
  • 超全!python中字符串拼接的各种姿势
    Python提供了多种字符串拼接的方式,每种方式在性能、可读性和灵活性上各有特点。以下是常见的字符串拼接方式及其总结:1.使用+操作符s1="Hello"s2="World"result=s1+""+s2#HelloWorld特点:简单易懂,适合小规模拼接。多个+拼接可能生成多个中间字符......
  • Shell脚本入门指南(二):环境变量与字符串操作
    声明学习视频来自B站up主**泷羽sec**有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!有兴趣的小伙伴可以点击下面连接进入b站主页[B站......