c++写:小胡虽然在儿童节小挣了一笔,但是记录过消费后,他发现自己得开源节流了。所以他买了好多只小鸡仔,通过养鸡来增加收入。 但是这些小鸡实在是太吵了,整天叽叽叽个不停,小胡被吵得神经衰弱,都快产生幻听了,只觉得一串一串的回声在脑子里盘旋。 声音化作了两串字符串,表示他听到的叽叽声,两串声音中最长的重复部分就是他的幻听。 最长重复部分指的是:从一个字符串第一个字符开始的连续字符串和从另一个字符串最后一个字符开始的连续字符串,完全相同的最大长度。 例如以下两串叽叽声: aNBHhjsada jsadasdfdfdfdfdaNB 第一个字符串的前缀 aNB 和第二个字符串的后缀相同; 第一个字符串的后缀 jsada 和第二个字符串的前缀相同; 而 jsada 比较长,所以最长的重复部分长度为 5 5。

时间: 2024-03-25 16:42:08 浏览: 15
好的,这是一个字符串匹配问题,可以使用哈希和二分的方法来解决。具体思路如下: 1. 定义一个哈希函数,将字符串转换为一个唯一的哈希值。 2. 定义一个二分函数,用来判断重复部分的长度。 3. 对于第一个字符串的每一个前缀,计算其哈希值,并将其存储在一个哈希表中。 4. 对于第二个字符串的每一个后缀,计算其哈希值,并在哈希表中查找是否有相同的哈希值。 5. 如果有相同的哈希值,则调用二分函数,判断重复部分的长度,并更新最大值。 6. 最后输出最大值即可。 下面是一份示例代码,供你参考: ```c++ #include <iostream> #include <string> #include <unordered_map> using namespace std; typedef long long LL; const LL P = 131; // 哈希函数中的质数 const int MAXN = 100010; // 字符串最大长度 int n, m; string s1, s2; LL h[MAXN], p[MAXN]; // 哈希函数和幂次 // 计算字符串的哈希值 LL get_hash(string &s) { LL res = 0; for (int i = 0; i < s.length(); i++) { res = (res * P + s[i]) % LLONG_MAX; } return res; } // 二分函数,判断重复部分的长度 int check(int len) { unordered_map<LL, int> hash; // 哈希表 int res = 0; LL h1 = 0, h2 = 0; // 分别表示第一个字符串和第二个字符串的哈希值 p[0] = 1; for (int i = 1; i <= len; i++) { h1 = (h1 * P + s1[i - 1]) % LLONG_MAX; h2 = (h2 + s2[m - i] * p[i - 1]) % LLONG_MAX; p[i] = p[i - 1] * P % LLONG_MAX; } hash[h1] = len; // 将第一个字符串的前缀哈希值存储到哈希表中 for (int i = len + 1; i <= n; i++) { h1 = (h1 * P + s1[i - 1]) % LLONG_MAX; // 计算下一个前缀的哈希值 h1 = (h1 - s1[i - len - 1] * p[len]) % LLONG_MAX; // 减去上一个前缀的哈希值 if (h1 < 0) h1 += LLONG_MAX; // 防止负数出现 if (hash.count(h1)) { // 如果哈希表中有相同的哈希值 int j = hash[h1]; if (i - j <= len) { // 判断是否为重复部分 res = max(res, i - j); } } h2 = (h2 * P + s2[m - i + len]) % LLONG_MAX; // 计算下一个后缀的哈希值 h2 = (h2 - s2[m - i] * p[len]) % LLONG_MAX; // 减去上一个后缀的哈希值 if (h2 < 0) h2 += LLONG_MAX; // 防止负数出现 hash[h2] = i; // 将后缀的哈希值存储到哈希表中 } return res; } int main() { cin >> s1 >> s2; n = s1.length(); m = s2.length(); int l = 0, r = min(n, m); while (l < r) { // 二分查找最长重复部分的长度 int mid = (l + r + 1) / 2; if (check(mid) >= mid) { l = mid; } else { r = mid - 1; } } cout << l << endl; // 输出最长重复部分的长度 return 0; } ```

相关推荐

最新推荐

recommend-type

linux系统中c++写日志文件功能分享

主要介绍了linux系统中c++写日志文件功能,简化了glog,只保留了写日志文件的功能,只是改写了linux版本,需要的朋友可以参考下
recommend-type

C++ boost::asio编程-异步TCP详解及实例代码

主要介绍了C++ boost::asio编程-异步TCP详解及实例代码的相关资料,需要的朋友可以参考下
recommend-type

C++ boost::asio编程-同步TCP详解及实例代码

主要介绍了C++ boost::asio编程-同步TCP详解及实例代码的相关资料,需要的朋友可以参考下
recommend-type

C++ 中boost::share_ptr智能指针的使用方法

主要介绍了C++ 中boost::share_ptr智能指针的使用方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
recommend-type

C++标准库:std_set作为一个有序集合

std::set作为标准库的一个关联容器,实现内部元素进行了排序,使用这特性可以对一组元素进行插入排序。std::set最初的设计是完成数学中“集合”的概念,它提供的接口也是如此。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。