首页 > 其他分享 >20240904:字符串选做

20240904:字符串选做

时间:2024-09-04 17:38:41浏览次数:4  
标签:suf 选做 vert 20240904 题意 le 字符串 回文

P4555 [国家集训队] 最长双回文串

题意:给定字符串 \(s\),找到他最长双回文串 \(t\) 的长度。双回文串定义为存在一个 \(i > 1\) 使得 \(t[1, i)\) 和 \(t[i, n]\) 都是回文串。\(\vert s\vert \le 10^5\)。

二分哈希求出所有回文中心的半径,设以 \(i\) 为中心的最长回文串为 \([l_i, r_i]\)。

我们发现当两个回文中心确定时,最长双回文串的长度唯一确定(左边界向左延伸一格必须先使右边界往里缩一格,否则左右两串出现重叠)。

枚举回文中心 \(i\),找到一个最小的 \(j\) 使得 \(r_j \ge l_i - 1\),显然可以树状数组维护,在 \(r_i\) 的位置加入 \(i\)。submission

P3546 [POI2012] PRE-Prefixuffix

题意:定义 \(s\) 和 \(t\) 是循环相同的,当且仅当 \(s\) 能够将一个后缀移到开头使得与 \(t\) 完全相同。

给出字符串 \(s\),找到最大的 \(i \le \frac{n}{2}\) 使得前缀 \(pre_i\) 和后缀 \(suf_i\) 是循环相同的。

枚举 \(s\) 的 border \(i\),再找 \(s[i + 1, n - i]\) 的最长不重叠 border,令 \(s_i = s[i + 1, n - i]\),发现把 \(s_i\) 的 border 掐头去尾就是 \(s_{i + 1}\) 的 border。

反过来讲,有 \(B_{\max}(s_i) \le B_{\max}(s_{i + 1}) + 2\),设 \(p = B_{\max}(s_i)\),当 \(i \to i - 1\) 时,令 \(p \to p + 2\),然后不断减 \(1\) 直到合法,势能分析可以得出是线性的。

submission

更加巧妙的做法:把 \(s\) 重排成 \(s_1s_ns_2s_{n - 1} \cdots\),那么两个 border 就是最靠前的两个相邻回文串(长度皆为偶数),和上题一样维护。

Minimal String Xoration

题意:给定一个长度为 \(2^n\) 的字符串 \(s\),选出一个 \(k \in [0, 2^n)\) 使得满足 \(t_i = s_{i \oplus k}\) 的字符串 \(t\) 的字典序最小,输出 \(t\)。\(n \le 18\)。

\(f(k, i)\) 表示选了 \(k\) 得到字典序最小的 \(t\) 的 \(2^i\) 的前缀,显然有 \(f(k, i) = f(k, i - 1) + f(k \oplus 2^{i - 1}, i - 1)\),+ 表示拼接。

类似后缀数组 \(O(n\log n)\) 构造,求出 \(f(k, i - 1)\) 和 \(f(k \oplus 2^{i - 1}, i - 1)\) 在 \(i - 1\) 时的排名就可以当做两位数排序。

时间复杂度 \(O(n^22^n)\),基数排序可以省掉一个 \(n\)。submission

x-prime Substrings

题意:定义只有数字组成的字符串 \(s\) 是 x-prime 的当且仅当 \(\sum s_i = x\) 且不存在一个子串和是 \(x\) 的真因子(不是他本身)。

给定字符串 \(s\) 和正整数 \(x\),求 \(s\) 至少要删掉多少字符才不存在一个子串是 x-prime 的。\(\vert s\vert\le 1000, x\le 20\)。

注意到 \(x\) 很小,满足 x-prime 的字符串应当也很少,称之为非法子串。

删多少字符才能不存在非法子串的这类问题很容易想到构造 ac 自动机,最坏情况下,所有非法串构成的字典树大小只有 \(S = 4853\)。

\(f(i, s)\) 表示前 \(i\) 个字符匹配到 ac 自动机的状态 s 时需要删多少个才合法,枚举 \(i\) 删不删,时间复杂度 \(O(\vert s\vert S)\)。submission

P7361 「JZOI-1」拜神

题意:给定字符串 \(s\),\(q\) 次询问 \(s[l, r]\) 出现至少两次的最长子串长度。\(n \le 5\times 10^4, q\le 10^5\)。

考虑询问的本质,长度 \(L\) 合法等价于存在 \(i ,j \in [l, r - L + 1]\) 满足 \(\text{lcp}(suf_i, suf_j) \ge L\),可以二分。

后缀排序求出 height 数组,\(h_i = \text{lcp}(suf_{sa_i}, suf_{sa_{i - 1}})\),考虑 \(suf_{sa_i}\) 与 \(suf_{sa_{i - 1}}\) 连边,那么 \(L\) 合法就是加入所有 \(h \ge L\) 之后 \(i, j\) 在同一连通块。

维护 \(nxt_i\) 表示与 \(i\) 在同一连通块的大于 \(i\) 的最小后缀编号,这个东西可以并查集的启发式合并实现,每个连通块开个 set 维护所有编号。

那么长度 \(L\) 到底怎么判断呢?区间查询 \([l, r - L]\) 当中最小的 \(nxt_i\) 是否 \(\le r - L + 1\),显然可以线段树。

你当然可以离线。也可以维护持久化线段树 \(T_i\) 表示加入所有 \(h \ge i\) 后 \(1 \sim n\) 的 \(nxt\) 值,时空复杂度皆为 \(O(n\log^2n)\)。submission

标签:suf,选做,vert,20240904,题意,le,字符串,回文
From: https://www.cnblogs.com/Luxinze/p/18397011

相关文章

  • 日志打印的时候使用占位符而不是用字符串拼接
    日志打印的时候使用占位符而不是用字符串拼接1.logger.info("错误信息:"+e.getMessage());  //字符串拼接2.logger.info("错误信息:{}"+e.getMessage()); //使用占位符(正确使用方式)因为String字符串的拼接会使用StringBuilder的append()方式,有一定的性能损耗。......
  • 给自己复盘的随想录笔记-字符串练习题
    反转字符串344.反转字符串-力扣(LeetCode)双指针+元素交换 classSolution{publicvoidreverseString(char[]s){chartemp;intl=0,r=s.length-1;while(l<r){temp=s[l];s[l]=s[r];s[r]=temp;l++;......
  • CF 2010 C2. Message Transmission Error (hard version) (*1700) 字符串+哈希
    CF2010C2.MessageTransmissionError(hardversion)(*1700)字符串+哈希题目链接题意:给你一个字符串,让你判断是否是由某个字符串首尾拼接重叠而成的。思路:做法很多,最暴力就直接枚举字符串长度,然后哈希即可。代码:#include<bits/stdc++.h>usingnamespacestd;#def......
  • 20240904_132638 mysql 填空题 备份与恢复
    备份数据,以root用户身份,提示输入密码后,将my_school数据库的所有结构和数据导出为SQL语句,并将这些SQL语句保存到当前目录下的bf.sql文件中mysqldump-uroot-pmy_school>bf.sql恢复数据,以root用户的身份连接到MySQL服务器,然后执行bf.sql的命令把数据恢复到my_s......
  • 20240904_121403 mysql 数据库的备份与恢复 命令篇
    对数据库进行备份操作通过cmd打开命令提示符关注当前的路径通过命令来实现备份备份my_school的库到bf2.sql备份的结果在当前的路径下C:\Users\Administrator会存在bf2.sql文件恢复备份提前建库进入mysql创建要恢复的库my_schoolcmd命令导入sql内容当前路径要......
  • 代码随想录算法day7 - 字符串1
    题目1344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。示例1:输入:s=["h","e","l","l","o"]输出:["o","l","l","e",&qu......
  • 字符串行转列 regexp_split_to_table
    在Greenplum数据库中,regexp_split_to_table是一个非常有用的函数,它允许你根据正则表达式将字符串分割成多个部分,并将这些部分作为表中的行返回。这个函数在处理文本数据时特别有用,尤其是当你需要将一个字段中的复合数据分解为独立的元素时。语法regexp_split_to_table(str......
  • 20240904_122638 mysql 填空题 dcl
    记录用户帐户密码的数据表,保存在哪个数据库中mysql记录用户帐户密码的数据表,叫什么名字user创建了一个名为pyhui的用户,该用户只能从本地机器连接到MySQL服务器,并且其密码是abccreateuser'pyhui'@'localhost'identifiedby'abc'删除名为pyhui的用户,该用户只能从localho......
  • 20240904_112638 mysql 填空题 事务
    开启事务starttransaction提交事务commit回滚事务rollback事务中创建一个名为c的存档点savepointc事务中回到名为m的存档点savepointm设置自动提交打开setautocommit=1设置自动提交关闭setautocommit=0......
  • string字符串
    string字符串1.翻转字符串#include<bits/stdc++.h>usingnamespacestd;intmain(){ strings; getline(cin,s); /*方法1.reverse搭配迭代器 reverse(s.begin(),s.end()); cout<<s; */ /*方法2.反着输出 for(inti=s.length()-1;i>=0;i--){ cout<<s[i]; }*/ //方法3.一半交换 ......