POJ 2774 Long Long Message

本文介绍了一种算法,用于求解两个长度不超过100000的字符串之间的最长公共子串问题,通过二分搜索和哈希映射实现O(NlogN)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

求两个长度不超过100000的字符串的最长公共子串, 注意是子串而非子序列, 所以是连续的.

 

简要分析:

二分答案M, 设两个串分别为A和B, 从左到右枚举一遍A的长为M的子串, 算出哈希值丢到map里面, 再从左到右枚举一遍B的长为M的子串, 算出哈希再到map里面找. O(NlogN).

 

代码实现:

View Code
 1 #include <cstdio>
2 #include <cstdlib>
3 #include <cstring>
4 #include <algorithm>
5 using namespace std;
6
7 typedef unsigned long long hash_t;
8 const int MAX_N = 100000, SEED = 99991;
9 char a[MAX_N + 1], b[MAX_N + 1];
10 int lena, lenb;
11 hash_t mypow[MAX_N];
12
13 struct hash_map_t {
14 static const int MOD = 196613;
15 int cnt, begin[MOD], next[MAX_N];
16 hash_t end[MAX_N];
17 void clear() { cnt = 0, memset(begin, -1, sizeof(begin)); }
18 hash_map_t() { cnt = 0, memset(begin, -1, sizeof(begin)); }
19 void push(hash_t x) {
20 int s = x % MOD;
21 for (int now = begin[s]; now != -1; now = next[now])
22 if (end[now] == x) return;
23 next[cnt] = begin[s];
24 begin[s] = cnt;
25 end[cnt ++] = x;
26 }
27 bool ask(hash_t x) {
28 int s = x % MOD;
29 for (int now = begin[s]; now != -1; now = next[now])
30 if (end[now] == x) return 1;
31 return 0;
32 }
33 } hash;
34
35 bool check(int len) {
36 hash.clear();
37 hash_t t = 0ULL;
38 for (int i = 0; i < len; i ++) t = t * SEED + a[i];
39 hash.push(t);
40 for (int i = 1; i < lena - len + 1; i ++) {
41 t = (t - mypow[len - 1] * a[i - 1]) * SEED + a[i + len - 1];
42 hash.push(t);
43 }
44 t = 0ULL;
45 for (int i = 0; i < len; i ++) t = t * SEED + b[i];
46 if (hash.ask(t)) return 1;
47 for (int i = 1; i < lenb - len + 1; i ++) {
48 t = (t - mypow[len - 1] * b[i - 1]) * SEED + b[i + len - 1];
49 if (hash.ask(t)) return 1;
50 }
51 return 0;
52 }
53
54 int main() {
55 mypow[0] = 1ULL;
56 for (int i = 1; i < MAX_N; i ++) mypow[i] = mypow[i - 1] * SEED;
57 while (scanf("%s%s", a, b) != EOF) {
58 lena = strlen(a), lenb = strlen(b);
59 int lb = 0, rb = min(lena, lenb) + 1;
60 while (lb + 1 < rb) {
61 int mid = (lb + rb) >> 1;
62 if (check(mid)) lb = mid;
63 else rb = mid;
64 }
65 printf("%d\n", lb);
66 }
67 return 0;
68 }

转载于:https://www.cnblogs.com/zcwwzdjn/archive/2012/03/09/2388373.html

标题SpringBoot与Vue融合的垃圾分类回收网站研究AI更换标题第1章引言介绍垃圾分类的重要性,SpringBoot与Vue技术融合的优势,以及本研究的意义和价值。1.1研究背景与意义分析当前垃圾分类的紧迫性和SpringBoot与Vue在垃圾分类回收网站开发中的应用前景。1.2国内外研究现状概述国内外在垃圾分类回收系统方面的研究现状和技术应用情况。1.3论文方法与创新点说明本文采用的研究方法和系统开发的创新之处。第2章相关技术概述简述SpringBoot和Vue的技术特点及其在垃圾分类回收网站中的应用。2.1SpringBoot框架介绍介绍SpringBoot框架的主要特点和优势。2.2Vue.js框架介绍阐述Vue.js框架的基本原理和应用范围。2.3SpringBoot与Vue的融合应用探讨SpringBoot后端与Vue前端如何有效融合,提升用户体验。第3章垃圾分类回收网站系统设计详细描述基于SpringBoot和Vue的垃圾分类回收网站的设计方案。3.1系统架构设计给出系统的整体架构设计,包括前后端分离的设计思路。3.2数据库设计介绍系统所使用的数据库结构设计和数据表关系。3.3界面设计阐述基于Vue的前端界面设计,包括用户交互流程和界面展示。第4章系统实现与测试详细介绍垃圾分类回收网站的实现过程和测试情况。4.1系统后端实现说明SpringBoot后端的具体实现,包括接口设计、业务逻辑处理等。4.2系统前端实现Vue前端的具体实现,包括组件开发、状态管理等。4.3系统测试与性能分析对系统进行功能测试和性能测试,分析系统的稳定性和响应速度。第5章结论与展望总结本文的研究成果,展望未来的研究方向和应用前景。5.1研究结论概括性地阐述本文的主要研究结论和系统的实际应用价值。5.2未来研究方向提出未来可能的研究方向,如系统优化、智能分类算法研究等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值