HDU1403 Longest Common Substring —— 后缀数组

神领物流-day01-项目概述 公司从2019年开始业务快速扩张,网点数量从138家扩展至540家,车辆从170台增长到800台。同时,原有的系统非常简单,比如车辆的调度靠人工操作、所有的货物分拣依靠人员,核心订单数据手动录入,人效非常低。随着业务不断演进,技术的不断提升,原有运输管理系统已无法满足现有快速扩展下的业务需求,但针对现有系统评估后发现,系统升级成本远高于重新研发。因此,公司决定基于现有业务体系进行重新构建,打造一套新的TMS运输系统,直接更替原有系统。 阅读详情

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1403


Longest Common Substring

Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6792    Accepted Submission(s): 2401


Problem Description
Given two strings, you have to tell the length of the Longest Common Substring of them.

For example:
str1 = banana
str2 = cianaic

So the Longest Common Substring is "ana", and the length is 3.
 

Input
The input contains several test cases. Each test case contains two strings, each string will have at most 100000 characters. All the characters are in lower-case.

Process to the end of file.
 

Output
For each test case, you have to tell the length of the Longest Common Substring of them.
 

Sample Input
  
banana cianaic
 

Sample Output
  
3
 

Author
Ignatius.L




题解:

1.将两个字符串接在一起,并用特殊分隔符分开。然后跑一下后缀数组,得出height[]数组。

2.枚举height[]数组,如果排位相邻的两个后缀字符串的开头分别在两边(原先的两个字符串),则更新答案。



后缀数组学习推荐:

http://blog.youkuaiyun.com/yxuanwkeith/article/details/50636898

http://blog.youkuaiyun.com/j_sure/article/details/41777097




代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int mod = 1e9+7;
const int MAXN = 2e5+10;

bool cmp(int *r, int a, int b, int l)
{
    return r[a]==r[b] && r[a+l]==r[b+l];
}

int t1[MAXN], t2[MAXN], c[MAXN];
void DA(int str[], int sa[], int Rank[], int height[], int n, int m)
{
    int i, j, p, *x = t1, *y = t2;
    for(i = 0; i<m; i++) c[i] = 0;
    for(i = 0; i<n; i++) c[x[i] = str[i]]++;
    for(i = 1; i<m; i++) c[i] += c[i-1];
    for(i = n-1; i>=0; i--) sa[--c[x[i]]] = i;
    for(j = 1; j<=n; j <<= 1)
    {
        p = 0;
        for(i = n-j; i<n; i++) y[p++] = i;
        for(i = 0; i<n; i++) if(sa[i]>=j) y[p++] = sa[i]-j;

        for(i = 0; i<m; i++) c[i] = 0;
        for(i = 0; i<n; i++) c[x[y[i]]]++;
        for(i = 1; i<m; i++) c[i] += c[i-1];
        for(i = n-1; i>=0; i--) sa[--c[x[y[i]]]] = y[i];

        swap(x, y);
        p = 1; x[sa[0]] = 0;
        for(i = 1; i<n; i++)
            x[sa[i]] = cmp(y, sa[i-1], sa[i], j)?p-1:p++;

        if(p>=n) break;
        m = p;
    }

    int k = 0;
    for(i = 0; i<=n; i++) Rank[sa[i]] = i;
    for(i = 0; i<n; i++)
    {
        if(k) k--;
        j = sa[Rank[i]-1];
        while(str[i+k]==str[j+k]) k++;
        height[Rank[i]] = k;
    }
}

char a[MAXN], b[MAXN];
int r[MAXN], sa[MAXN], Rank[MAXN], height[MAXN];
// sa[]下标的有效值:0~n-1;  height[]下标的有效值:1~n-1
int main()
{
    while(scanf("%s%s", a, b)!=EOF)
    {
        int lena, lenb, len;
        lena = strlen(a);
        lenb = strlen(b);

        len = 0;
        for(int i = 0; i<lena; i++) r[len++] = a[i];
        r[len++] = 1;
        for(int i = 0; i<lenb; i++) r[len++] = b[i];
        r[len++] = 0;
        DA(r, sa, Rank, height, len, 128);

        int ans = 0;
        for(int i = 1; i<len; i++)
            if( (sa[i]<lena && sa[i-1]>lena) || (sa[i]>lena && sa[i-1]<lena) )
                ans = max(ans, height[i]);
        printf("%d\n", ans);
    }
    return 0;
}


华为OD机考真题 新系统 - 小菊的寻宝之旅(Java/Py/C/C++/Js/Go) 华为OD机试真题 新系统【小菊的寻宝之旅】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【小菊的寻宝之旅】多语言题解。 阅读详情

相关推荐

2025.1.16——五、LoveSQL1 sqlmap文件类|万能密码

题目来源:BUUCTF[极客大挑战2019]LoveSQL1。

2402_87387800的博客 1067

HDU - 1403 Longest Common Substring :(后缀数组之两串中的最大重复子串)

  近来重新学习后缀数组,顺便熟悉kuangbin大佬的模板,发现后缀数组的用法真的多,开始慢慢记录= =    题目大意: 题意很简单,直接求两个串中的共有的最长重复子串。   解题思路: 首先看一个串的最长重复子串,其实就是height数组的最大值。 但是这个题目有个限制条件,要求这个串必须出现在两个串中,那么我们直接以sa数组直接加以判断当前后缀在哪个串即可。   Ac代...

污miao汪的博客 457

CRPR的三种关键影响:从SI、OCV到Min Pulse Width的时序优化实践

本文深入探讨了CRPR(时钟重汇聚悲观度消除)在芯片时序优化中的三种关键影响:信号完整性(SI)、片上变异(OCV)和最小脉宽检查。通过实际案例分析和技术细节,展示了CRPR如何有效修正时序分析中的过度保守估计,提升设计精度。文章特别强调了SI-aware CRPR的调试技巧和OCV补偿的最佳实践,为芯片设计工程师提供了宝贵的时序优化指导。

weixin_30920853的博客 379

HDU 1403 Longest Common Substring (后缀数组模板题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1403 解题思路:数据100000,普通LCS超时。 用后缀数组 N*logN 求得LCS 首先一定要了解一下基数排序。 参考的是罗穗骞大佬的论文,放个链接:https://wenku.baidu.com/view/5b886b1ea76e58fafab00374.html 对其中一些地方的理...

shadiao.的博客 322

手把手教你逆向抖店滑块验证码:从抓包到生成captchaBody的完整流程(附Python复现代码)

本文详细解析了抖店滑块验证码的逆向过程,从抓包分析到参数生成,最终用Python完整复现验证流程。涵盖关键接口分析、指纹参数生成、轨迹加密逻辑及核心加密算法实现,帮助开发者突破抖店的多重安全机制,实现高效的人机验证绕过。

weixin_30681121的博客 425

深入解析AMBA5 AXI与ACE协议:从基础到高级应用

本文深入解析了AMBA5 AXI与ACE协议的核心机制与应用。AXI协议通过分离通道、突发传输和乱序完成实现高性能数据传输,而ACE协议在此基础上构建了硬件级缓存一致性解决方案,通过监听机制和状态模型确保多核系统数据统一。文章还探讨了在异构计算等复杂场景下的实战应用与AMBA5的新特性。

cc789的博客 963

hdu 1403 Longest Common Substring 后缀数组求最长公共子串

Longest Common Substring Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5823    Accepted Submission(s): 2063 Problem Description G

Kblacksmith的博客 549

【商业化】【msix打包】Python 应用打包为 MSIX 的正确流程:入口点问题与解决方案

发现用msix打包工具打包python做的exe时总找不到程序入口点,后来理了一下才发现自己误会了,需要先生成一个基本的setup.exe,msix的打包是基于这个初始的安装程序进行的。只需要点击Buile-》Compile,然后Open Output Folder就可以得到exe安装程序了。可以使用免费工具inno setup来创建初始安装包。其中{group}这样的变量会自动匹配,不用自己指定。如果点击Run会运行安装程序。

每日出拳老爷子的博客 1105

Longest Common Substring HDU - 1403

题目链接 HDU-1403 题意 给定两个字符串,求最长公共子串的长度。 分析 先考虑简化问题: 求在一个串中至少出现两次的最长子串。 答案就是在后缀数组中相邻的后缀的最长公共前缀。因为在后缀数组中的起始位置相距越远,他们的最长公共前缀就越小。所以只要求出高度数组的最大值即可。 问题转化: 将两个字符串连接起来并在连接处添加一个字符’$’,形成新串s.这样求在s中至...

EnjoyingAC的博客 329

YOLO26模型应用过程中的报错处理及疑问解答,涉及环境搭建、模型训练、模块改进、论文写作

本文记录了YOLO26模型的这一系列过程中可能发生的问题,以及大家非常关心的问题,这里统一做了一个记录和解答。

Limiiiing的博客 241

82、yolov11检测模型迁移瑞芯微rk3588和使用昇腾设备300i DUO卡推理 batch=1/3,支持昇腾NMS迁移npu推理

本文介绍了使用昇腾设备进行分割推理的测试流程,包括两种测试方式(cann+onnx和om)。首先验证300iDUO卡的可用性,随后创建Docker镜像和容器以搭建独立环境。通过从指定仓库拉取Ubuntu 20.04镜像,创建容器并映射目录。进入容器后安装必要组件(Python3、GCC等)和系统工具(pciutils、net-tools等),为后续模型转换和迁移做准备。整个流程旨在构建可交付给第三方的标准化测试环境。

sxj731533730 1202

HDU 1403 Longest Common Substring(后缀数组入门)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1403拖了这么久的后缀数组,终于准备学一学了。 做的第一题(套的第一个板子),虽然还是没看不懂是怎么实现的,但是还是可以套一套的。suffix(i)表示[0,len)的字符串的一个后缀,下标为[i,len)。后缀数组里,要求的是三个数组,sa[],rank[],height[]。 sa[i]表示的排名为

xtttgo的博客 707

YOLOv5源码逐行超详细注释与解读(2)——推理部分detect.py

全网最详细的YOLOv5之推理部分detect.py源码逐行注释,近四万字的超详细讲解!小白入门必看!

路人贾的博客 5万+

HDU1403 Longest Common Substring 后缀数组

<br />Problem Address:http://acm.hdu.edu.cn/showproblem.php?pid=1403<br /> <br />前不久在HDU上做了个友谊赛,结果惨不忍睹。<br /> <br />这道题当时是不知道得用后缀数组做的,做了n久还是TLE。<br /> <br />后来查了一下,然后又问了一下,发现确实是后缀数组。然后花了几天时间来学习= =<br /> <br />弱弱地贴下别人的代码,目前还没完全吃透……<br /> <br />#include <std

Human_CK的专栏 781

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

HDU1403 Longest Common Substring【后缀数组】

Time Limit: 8000/4000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Problem Description Given two strings, you have to tell the length of the Longest Common Substring of them. Fo...

MaJorieL 216

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

HDU - 1403 Longest Common Substring (后缀数组)

目录题目原文题目大意题目思路代码 题目链接 题目原文 Problem Description Given two strings, you have to tell the length of the Longest Common Substring of them. For example: str1 = banana str2 = cianaic So the Longest Common Substring is “ana”, and the length is 3. Input The input

QAQ 218

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

hdu 1403 Longest Common Substring 后缀数组 模板题

题目链接 题意 问两个字符串的最长公共子串。 思路 加一个特殊字符然后拼接起来,求得后缀数组与\(height\)数组。扫描一遍即得答案,注意判断起始点是否分别在两个串内。 Code #include <bits/stdc++.h> #define maxn 200010 using namespace std; typedef long long LL; int a[max...

ahu12345678的博客 172

hdu 1403 Longest Common Substring (后缀数组)

Longest Common Substring Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5776    Accepted Submission(s): 2052 Problem Description G

ilsswfr 381

hdu 1403 Longest Common Substring (后缀数组模板)

/* 题意:判断给定的两个串中,最长的公共串。 思路:将它们合并为一个串,然后利用后缀数组求解。 SA[i]存放排名第i大的子串首字符下标 rank[i]存放suffix(i)的优先级 height[i] 表示sa[i]和sa[i-1]的最长前缀 */ # include # include # include using namespace std; # define maxn 100001

苍竹林 491

hdu 1403 Longest Common Substring - 后缀数组

/* 第一次做后缀数组 就是求连个串的公共子串 简单的后缀数组 */ #include #include #define MAXN 200010 char str[100000+10]; int r[100000*2+10]; int wa[MAXN], wb[MAXN], wv[MAXN], ws[MAXN]; int sa[MAXN]; //index range 1~n va

813

HDU1403 Longest Common Substring(最长公共子串、后缀数组入门)

后缀数组入门题

请刷题2016 575

HDU-1403-Longest Common Substring(后缀数组的高度数组运用)

这题要求两个串中的最长相同子串的长度。高度数组可以求一个串中的最长相同子串的长度。所以想到把两个串连起来,但是这样又会产生一些新的串(第一个串的结尾和第二个串的开头组成的)于是在两个串中间放一个'\0'分隔,正好'\0'是字符里最小的,不会对第一个串的排序产生影响。 Accepted 1403 62MS 5344K 2117 B G++ #inc...

148

hdu 1403 Longest Common Substring 后缀数组da算法

/* *suffix array *倍增算法 O(n*logn) *待排序数组长度为n,放在0~n-1中,在最后面补一个0 *da(str ,n+1,sa,rank,height, , );//注意是n+1; *例如: *n = 8; *num[] = { 1, 1, 2, 1, 1, 1, 1, 2, $ };注意num最后一位为0,其他大于0 *rank[] = { 4, 6, 8, 1, 2,

禅境花园 517

hdu 1403 Longest Common Substring (后缀数组模板题)

题意: 求两个串的最长公共子串。 题解: 后缀数组搞定。 #include #include #include #include #include #include #include #include #include using namespace std; #define B(x) (1<<(x)) typedef long long ll; const int oo=0x3f3f3f

ACM之梦 604

HDU 1403 Longest Common Substring(后缀数组 最长公共子串)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1403 题意:给定两个串,要求输出两个串的最长公共子串的长度 解题思路:后缀数组,在height数组上做文章 其实这个题目和上面两篇博客的算法思路基本上是一致的,首先把两个字符串拼接成一个字符串,在拼接之前记录下拼接的位置,方便后续处理 完成之后二分答案,二分的过程中要判断每个当前要判断

sunrain的专栏 927

hdu 1403 Longest Common Substring(最长公共子字符串)(后缀数组)

http://acm.hdu.edu.cn/showproblem.php?pid=1403 Longest Common Substring Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3068 Accepted...

diansitao5461的博客 149
上一篇: POJ2104 K-th Number —— 划分树(模板题)
下一篇: POJ2243 Knight Moves —— A*算法
DOLFAMINGO
博客等级 码龄10年 8粉丝 216原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值