HDU1403 Longest Common Substring —— 后缀数组

保姆级教程:用海思PQTool搞定ISP图像调试,从参数读取到固件烧录全流程 本文提供海思PQTool的ISP图像调试全流程指南,从参数读取、实时调试到固件烧录,涵盖环境配置、核心功能解析、参数固化及生产部署。通过实战案例和避坑指南,帮助开发者高效提升图像质量,适用于海思开发板的ISP调试与优化。 阅读详情

题目链接: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;
}


利用ArcMap实现遥感图像语义分割标注的完整流程解析 本文详细解析了利用ArcMap进行遥感图像语义分割标注的完整工作流。从工程创建、数据导入、SHP文件创建,到实战勾画地物、要素转栅格,再到最终的裁剪对齐,提供了每一步的关键操作与避坑指南。该方法特别适合处理大尺寸、带地理坐标的遥感影像,能高效产出精准对齐的图像-标签对,为后续深度学习模型训练奠定可靠的数据基础。 阅读详情

相关推荐

从DIY到实战:手把手教你搭建一个媲美吉时利2450的nA级电流源表(附原理图与避坑指南)

本文详细解析如何从零打造nA级精密电流源,涵盖核心设计原理、PCB布局技巧、热电偶效应应对及校准验证体系。通过低成本替代方案和优化设计,实现媲美商用源表的性能,特别适合硬件爱好者和独立开发者。文章还提供原理图与避坑指南,助你轻松搭建高精度电流源系统。

weixin_42656416的博客 293

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

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

污miao汪的博客 457

EEG | CHB-MIT癫痫数据集CNN分类实战(一)

CHB-MIT癫痫数据集CNN分类实战

Always learn from the best. 1万+

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

深信服AC1000-B1200到手第一步:从开箱到激活上网的保姆级图文指南

本文提供深信服AC1000-B1200企业级行为管理设备的详细开局使用指南,涵盖从开箱验机、物理连接到网络配置、安全加固及设备激活的全流程。通过图文并茂的步骤解析,帮助用户快速完成设备初始化并实现安全上网,特别适合初次接触该设备的网络管理员参考。

weixin_42546392的博客 548

OpenSSL玩转证书链:从Windows CA根证书到签发多域名/IP的服务器证书全攻略

本文详细介绍了如何使用OpenSSL在Windows环境下构建私有CA体系,从创建CA根证书到签发支持多域名/IP的服务器证书的全流程。通过实战指南,读者可以掌握零成本证书管理技术,灵活配置SAN扩展,并了解在Nginx、Apache等主流服务器中的证书部署方法,适用于企业内网、IoT设备等HTTPS加密场景。

weixin_28731223的博客 440

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

Windows打印体系结构之Windows内置打印驱动程序

时间是一种很残酷的东西,它只会冲淡能够冲淡的,但也会洗尽铅华帮你留下该留下的。1.3.4、Windows内置打印驱动程序现在的Windows下的打印机驱动程序通常分为V4打印机驱动程序(V4 Printer Driver)、XPS打印机驱动程序(XPSDrv)、微软通用打印机驱动程序(Microsoft UniversalPrinter Driver)、微软PostScri...

weixin_34309435的博客 2254

Longest Common Substring HDU - 1403

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

EnjoyingAC的博客 329

YOLOv11【第三章:高阶应用与落地篇·第1节】一文搞懂,YOLOv11-Seg 实例分割:Mask 原型生成与系数预测原理解析!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1249

第十二段:基于env的重用

现代芯片的验证通常分为两个层次, 一是模块级别( block level, 也称为IP级别、 unit级别) 验证, 二是芯片级别( 也称为SOC级别) 验证。 一个大的芯片在开发时, 是分成多个小的模块来开发的。 每个模块开发一套独立的验证环境, 通常每个模块有 一个专门的验证人员负责。 当在模块级别验证完成后, 需要做整个系统的验证。 假设某个系统分成了三个模块,如下图: 这三个模块在模块级别验证时, 分别有自己的driver和s...

年糕的博客 423

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

基于鸿蒙 UniProton 的汽车电子系统开发指南

基于鸿蒙UniProton实时操作系统,提供了汽车电子系统开发的完整指南。通过统一的设计模式和开发规范,实现了高效、可靠的汽车电子系统开发。

m0_67505153的博客 179

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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、付费专栏及课程。

余额充值