字符串算法习题分析

目录

  • 1 [POI2006]OKR-Periods of Words
  • 2 同构字符串
  • 3 Camp Schedule

1 [POI2006]OKR-Periods of Words

P3435 [POI2006] OKR-Periods of Words - 洛谷

题目描述

定义 Q Q Q A A A 的周期,当且仅当 Q Q Q A A A 的严格前缀,且 A A A Q + Q Q + Q Q+Q 的前缀( A A A 可以等于 Q + Q Q+Q Q+Q)。特别地,如果没有满足的 Q Q Q A A A 的周期为空串。

给出一个串,求出其所有前缀的最大周期长度之和。

题解

举个例子: A = abcabcab A=\texttt{abcabcab} A=abcabcab Q max ⁡ = abcabc Q_{\max}=\texttt{abcabc} Qmax=abcabc

实际上是把 abcabcab \texttt{abcabcab} abcabcab 拆成了 abcabc + ab \texttt{abcabc} + \texttt{ab} abcabc+ab。而且,为了满足题目要求, ab \texttt{ab} ab 还要是 abcabc \texttt{abcabc} abcabc 的前缀。所以 ab \texttt{ab} ab 应当是 A A A 的公共前后缀。

不难发现,例子里的 ab \texttt{ab} ab 就是 A A A最短公共前后缀,这样才能使周期最长。所以长度为 i i i 的前缀的最长周期是(这里公共前后缀就用 N e x t Next Next 表示):
max ⁡ { ∣ Q i ∣ } = i − min ⁡ { N e x t i } \max\{|Q_i|\}=i-\min\{Next_i\} max{Qi}=imin{Nexti}
怎么求 min ⁡ { N e x t i } \min\{Next_i\} min{Nexti} 呢?如果 N e x t i Next_i Nexti 是前缀 A i A_i Ai 的一个公共前后缀的长度,则 N e x t N e x t i Next_{Next_i} NextNexti 一定也是 A i A_i Ai 的一个公共前后缀的长度; N e x t N e x t N e x t i … Next_{Next_{Next_i}}\dots NextNextNexti 可以用 m i n i min_i mini 记录前缀 A i A_i Ai 的最短公共前后缀:
m i n i = { m i n N e x t i m i n N e x t i ≠ 0 N e x t i m i n N e x t i = 0 min_i= \begin{cases} min_{Next_i} &min_{Next_i}\ne 0\\ Next_i &min_{Next_i}=0 \end{cases} mini={minNextiNextiminNexti=0minNexti=0
解释:通过KMP算法可得, N e x t i Next_i Nexti 为前缀 A i A_i Ai 的最长公共前后缀,所以 m i n N e x t i min_{Next_i} minNexti 一定是 A i A_i Ai 所有的公共前后缀的最小值;如果 m i n N e x t i min_{Next_i} minNexti 0 0 0 ,为了先找到满足题意的周期,再考虑无合法周期,所以要等于 N e x t i Next_i Nexti (当然,如果 N e x t i Next_i Nexti 仍然等于 0 0 0 ,则说明前缀 A i A_i Ai 确实没有合法周期,此时算作空串)。

最后答案:
a n s = ∑ i = 1 ∣ m i n i ≠ 0 ∣ A ∣ ( i − m i n i ) ans=\sum_{i=1|min_i\ne0}^{|A|}(i-min_i) ans=i=1∣mini=0A(imini)

\\some code...
int main() {CLOSE;cin >> n >> s;s = " " + s;get_next(s);long long ans = 0;for (int i = 1; i <= n; i++) {minn[i] = minn[Next[i]];if (!minn[i])minn[i] = Next[i];if (minn[i])ans += i - minn[i];}cout << ans;return 0;
}

2 同构字符串

题目描述

同构字符串定义:若两个字符串 S S S T T T ( ∣ S ∣ = ∣ T ∣ |S|=|T| S=T),满足一种映射关系 f ( x ) f(x) f(x),使得 ∀ 1 ≤ i ≤ ∣ S ∣ , f ( S i ) = T i \forall 1\le i\le |S|,f(S_i)=T_i ∀1iS,f(Si)=Ti,则称 S S S T T T 是同构字符串,或者说 S S S T T T 同构。

例如, abaac \texttt{abaac} abaac xkxxz \texttt{xkxxz} xkxxz 同构,但与 nmmtt \texttt{nmmtt} nmmtt 不同构。

给定一个长为 n n n 的字符串 s s s (仅由小写字母组成)和 m m m 次询问,每次询问给出 ( x , y , l e n ) (x,y,len) (x,y,len),问 s x ∼ x + l e n − 1 s_{x\sim x+len-1} sxx+len1 是否和 s y ∼ y + l e n − 1 s_{y\sim y+len-1} syy+len1 同构。

题解

字符串 s s s 中每一位都由小写字母组成,所以不妨考虑用26个01串表示每一个字母的出现位置 0 \texttt 0 0 表示未出现, 1 \texttt 1 1 表示出现。分别对 s x s_x sx s y s_y sy 各求出 26 26 26 个01串,比较其能否一一对应。

如果能够对应,则证明 s x s_x sx 中每一种出现过的字母的位置关系都可以与 s y s_y sy 中的一个字母的位置重合,这两个字母满足映射关系,一一对应说明每一个字母都有映射关系,满足题意。

比如,若 s x = acbaa , s y = xzyxx s_x=\texttt{acbaa},s_y=\texttt{xzyxx} sx=acbaa,sy=xzyxx

字母 s x s_x sx字母 s y s_y sy
a \texttt{a} a 10011 \texttt{10011} 10011 x \texttt{x} x 10011 \texttt{10011} 10011
b \texttt{b} b 00100 \texttt{00100} 00100 y \texttt{y} y 00100 \texttt{00100} 00100
c \texttt{c} c 01000 \texttt{01000} 01000 z \texttt{z} z 01000 \texttt{01000} 01000
其他 00000 \texttt{00000} 00000其他 00000 \texttt{00000} 00000

其所有字母的位置都一一对应,满足映射关系,则 s x s_x sx s y s_y sy 同构。

//some code...
HASH H[30];
int main() {CLOSE;cin >> n >> m >> s;for (int i = 1; i <= 26; i++)H[i].init(128, mod), t[i] = " ";s = " " + s;for (int i = 1; i <= n; i++)  //预处理出s的所有字母的01串for (char j = 'a'; j <= 'z'; j++)t[j - 'a' + 1] += (s[i] == j ? "1" : "0");for (int i = 1; i <= 26; i++)H[i].make(t[i]);while (m--) {cin >> x >> y >> len;for (int i = 1; i <= 26; i++) {  //截取出sx和sy的每个字母的01串hh1[i] = H[i].get(x, x + len - 1);  hh2[i] = H[i].get(y, y + len - 1);}sort(hh1 + 1, hh1 + 27);  //排序比较能否一一对应sort(hh2 + 1, hh2 + 27);int flag = 0;for (int i = 1; i <= 26; i++)if (hh1[i] != hh2[i])flag = 1;if (flag)cout << "NO" << endl;elsecout << "YES" << endl;}return 0;
}

3 Camp Schedule

Camp Schedule - 洛谷

题目描述

给定两个01字符串 s , t s,t s,t,求01串 k k k ,要求 k k k 中的 0 \texttt 0 0 1 \texttt 1 1 的个数分别于 s s s 相等,且 k k k 中包含子串 t t t 的个数尽可能地多。

题解

求出 t t t 的循环节 Q Q Q,将 t t t 拆成 q + Q q + Q q+Q 的形式,则 k = q + Q + Q + Q + … k=q+Q+Q+Q+\dots k=q+Q+Q+Q+ 时包含 t t t 的个数最多。

最后注意考虑多余的 0 \texttt 0 0 1 \texttt 1 1 的问题。

//some code...
void get01(int& s0, int& s1, string s) {s0 = 0, s1 = 0;for (int i = 0; i < s.size(); i++) {if (s[i] == '0')s0++;elses1++;}
}
int main() {CLOSE;cin >> s >> t;int s0, s1, t0, t1;get01(s0, s1, s);get01(t0, t1, t);t = " " + t;get_next(t);string t2 = t.substr(Next[t.size() - 1] + 1, t.size() - Next[t.size() - 1] - 1); //取出循环节int t20 = 0, t21 = 0;get01(t20, t21, t2);if (t0 <= s0 && t1 <= s1) {s1 -= t1;s0 -= t0;cout << t.substr(1, t.size() - 1);}while (s0 - t20 >= 0 && s1 - t21 >= 0) { //重复循环节cout << t2;s0 -= t20;s1 -= t21;}for (int i = 1; i <= s1; i++) cout << '1';  //剩余的0和1输出for (int i = 1; i <= s0; i++) cout << '0';return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL库 —— priority_queue 的编写

目录 一、 优先级队列的介绍 二、优先级队列的使用 2.1 建大堆 less 2.2 建小堆 greater 2.3 详解 greater 与 less 三、 priority_queue 的模拟实现 3.1 编写框架 3.2 编写简单函数 3.2 进堆 向上调整 3.3 出堆 向下调整 四、完整代码 一、 优先级队列的介绍 1.…

web轮播图

思路&#xff1a; 例如&#xff1a;有5张轮播的图片&#xff0c;每张图片的宽度为1024px、高度为512px.那么轮播的窗口大小就应该为一张图片的尺寸&#xff0c;即为&#xff1a;1024512。之后将这5张图片0px水平相接组成一张宽度为&#xff1a;5120px,高度依然为&#xff1a;5…

守望先锋2怎么在steam上玩 守望先锋归来steam下载安装

守望先锋2怎么在steam上玩 守望先锋归来steam下载安装 《守望先锋2》是知名游戏开发商暴雪娱乐开发的团队射击游戏。与第一部相比&#xff0c;守望先锋2加入了更多元素和新特性。游戏设定在未来的世界&#xff0c;玩家可以选择不同的英雄&#xff08;heroes&#xff09;加入战…

python聊天室

python聊天室 文章目录 python聊天室chat_serverchat_client使用方式1.局域网聊天2.公网聊天 下面是一个简单的示例&#xff0c;包含了chat_client.py和chat_server.py的代码。 chat_server chat_server.py监听指定的端口&#xff0c;并接收来自客户端的消息&#xff0c;并将消…

35岁+技术人的困境与选择

前言 最近一些大厂的持续裁员事件&#xff0c;让职场年龄焦虑的话题又火热起来了。职场的年龄焦虑是客观存在的事实&#xff0c;这是市场与资本相互作用的必然结果。资本在运作的过程中&#xff0c;肯定是要逐利的&#xff0c;最终也是要趋向于利润最大化的。 因此&#xff0…

WdatePicker异常,无法弹出日期选择框

官网&#xff1a;My97日期控件官方网站 My97 DatePickerhttp://www.my97.net/ 可能使版本太老了&#xff0c;可以更新一下&#xff0c;然后根据官方的文件进行使用。 我的异常是因为在网上找的包里面缺少文件&#xff0c;去官网拉了一下最新的就行了。

AR地图导览小程序是怎么开发出来的?

在移动互联网时代&#xff0c;AR技术的发展为地图导览提供了全新的可能性。AR地图导览小程序结合了虚拟现实技术和地图导航功能&#xff0c;为用户提供了更加沉浸式、直观的导览体验。本文将从专业性和思考深度两个方面&#xff0c;探讨AR地图导览小程序的开发方案。 编辑搜图 …

数据结构之排序了如指掌(二)

目录 题外话 正题 选择排序 选择排序思路 选择排序代码详解 选择排序复杂度 双向选择排序 双向选择排序思路 双向选择排序代码详解 堆排序 堆排序思路 堆排序代码详解 堆排序复杂度 冒泡排序 冒泡排序思路 冒泡排序代码详解 冒泡排序复杂度 小结 题外话 今天…

变配电场所智能综合监控系统无人化与自动化升级改造

一 项目背景 国家电力建设飞速发展,为了提高管理水平,智能化建设迫在眉睫。变配电场所作为电网中的核心单元,数量巨大,是智能化建设的中坚部分。但由于变配电场所分布的地理位置过于分散&#xff0c;且配电网的自动化水平有待提高,单纯依靠人力来对变配电场所进行巡视,不仅增加…

python 文件输入输出

python 文件输入输出 一、输入输出1. 输出格式美化2. 旧式字符串格式化3. 读取键盘输入4. 读和写文件5. 文件对象的方法6. pickle 模块 二、文件操作1. File(文件) 方法2. mode 参数有&#xff1a;3. file 对象 三、 OS 文件操作1. OS 文件/目录方法 四、代码概览&#xff08;输…

【canvas】canvas综合运用:心形图案

#简言 利用canvas画出心形图案。 心形 心形图案可以两个椭圆相交组合&#xff0c;也可以直接画路径实现。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" conte…

深入了解CSS 元素尺寸单位:像素、百分比、em、rem 和 viewport 单位

你好&#xff0c;我是小白Coding日志&#xff0c;一个热爱技术的程序员。在这里&#xff0c;我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客&#xff0c;一起在技术的世界里探索前行吧&#xff01; 在前端开发中&am…

labelimg安装和使用(解决闪退问题)

&#x1f308;个人主页&#xff1a;Rookie Maker &#x1f525; 系列专栏&#xff1a;计算机视觉 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到我的代码世界~ &#x1f601; 喜…

图与图搜索算法

图搜索算法是一个非常重要的概念&#xff0c;它是计算机科学中图论和算法设计的基础部分。在开始讨论图搜索算法之前&#xff0c;我们需要先理解什么是图以及图的基本结构。 什么是图&#xff1f; 图&#xff08;Graph&#xff09;是一种非线性数据结构&#xff0c;它由一组点…

C 错误处理

C 语言不提供对错误处理的直接支持&#xff0c;但是作为一种系统编程语言&#xff0c;它以返回值的形式允许您访问底层数据。在发生错误时&#xff0c;大多数的 C 或 UNIX 函数调用返回 1 或 NULL&#xff0c;同时会设置一个错误代码 errno&#xff0c;该错误代码是全局变量&am…

Redis集群和哨兵

Redis集群和哨兵是Redis系统中的重要组件&#xff0c;它们在保障数据可靠性、扩展性和高可用性方面发挥着关键作用。 Redis集群主要解决了单一Redis实例在存储和性能上的限制。通过将数据分散到多个Redis节点上&#xff0c;集群能够实现数据的水平扩展&#xff0c;从而支持更大…

点云的投影------PCL

点云的投影 /// <summary> /// 参数化模型投影点云 /// </summary> /// <param name"cloud">点云</param> /// <param name"x">投影平面x面的系数</param> /// <param name"y"></param> /// &…

Python下利用Selenium获取动态页面数据

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Java中方法的重载:初学者易懂的指南

Java中方法的重载&#xff1a;初学者易懂的指南 在Java编程中&#xff0c;方法的重载&#xff08;Overloading&#xff09;是一个非常重要的概念。它允许我们在同一个类中定义多个同名但参数列表不同的方法。这样&#xff0c;我们就可以根据传递的参数类型和数量来执行不同的操…

使用python进行网站答题操作

介绍&#xff1a; 使用Python和DrissionPage模块编写自动化脚本&#xff0c;以模拟人的行为访问网站并获取题目答案进行自动答题。这个脚本似乎是为答题网站设计的&#xff0c;通过监控特定数据包地址来获取题目答案&#xff0c;并模拟点击正确答案进行答题。 代码中的逻辑包…