poj 2774 后缀数组(最长连续子串)

【后缀数组求最长公共子串】POJ 2774 根据罗的论文,两个串的中间要加一个ascii码比任何字母都小的字符 最长公共子串(pku2774,ural1517) 给定两个字符串A 和B,求最长公共子串。 算法分析: 字符串的任何一个子串都是这个字符串的某个后缀的前缀。求A 和B 的最长公共子串等价于求A 的后缀和B 的后缀的最长公共前缀的最大值。如果枚举A和B 的所有的后缀,那么这样做显然效率低下。由于要计算A 的后缀和B 的后缀的 阅读详情

题意:给定两个字符串,求这两个字符串的最长连续子串(注意和最长公共子串LCS的区别。LCS用dp来求)。

思路:后缀数组。有关后缀数组的概念可以参见罗穗骞的一篇文章。这道题的思路就是将两个字符串连接起来(中间用一个不相关的字符分开),再用后缀数组求出height数组的值,找出一个height值最大并且i与i-1的sa值分别在两串字符中就OK。

其中一个地方wa了n次,在最后判断的时候抖了个机灵写成(sa[i]-len1)*(sa[i-1]-len1)<0,原本以为其和(sa[i]<len1&&sa[i-1]>len1)||(sa[i]>len1&&sa[i-1]<len1)表达相同的意思。wa的原因应该和数据相乘溢出有关,因为字符串长度上界是200000,如果两个乘数都较大(比如都为50000),那么相乘溢出了int范围为负数,导致错误。

#include <stdio.h>
#include <string.h>
#define swap(a,b,c) c = a,a = b,b = c;
#define N 200005
char s[N];
int top[N],rank[N],b[N],v[N],r[N],sa[N],rank[N],h[N];
int cmp(int *q,int x,int y,int j){//非常巧妙。如果r[a]=r[b],说明以r[a]或r[b]开头的长度为l的字符串肯定不包括字符r[n-1],所以调用变量r[a+l]和r[b+l]不会导致数组下标越界
    return (q[x]==q[y])&&(q[x+j]==q[y+j]);//表示当前比较的2j长的字符串中前j个相同,后j个也相同
}
void getsa(int n,int m){//m是计数排序中的字符个数
    int i,j,p;
    int *x = rank,*y = b,*t;
    memset(top,0,sizeof(top));
    for(i = 0;i<n;i++)
        top[ x[i]=r[i] ]++;
    for(i = 1;i<m;i++)
        top[i] += top[i-1];
    for(i = n-1;i>=0;i--)//对长度为1的字符串进行排序(结果相当于对原字符串进行排序,此时sa保存的是排名为下标的是第几个字符)
        sa[--top[x[i]]] = i;
    
    for(p = j = 1;p<n;j*=2,m=p){
        for(p = 0,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<n;i++)
            v[i] = x[y[i]];
        memset(top, 0, sizeof(top));
        for(i = 0;i<n;i++)
            top[v[i]]++;
        for(i = 1;i<m;i++)
            top[i] += top[i-1];
        for(i = n-1;i>=0;i--)
            sa[--top[v[i]]] = y[i];
        swap(x,y,t);
        x[sa[0]] = 0;
        for(p = i = 1;i<n;i++)
            x[sa[i]] = cmp(y,sa[i-1],sa[i],j) ? p-1:p++;
    }
}
void getlcp(int n){//longest common prefix
    int i,j,k=0;
    for(i = 1;i<=n;i++)
        rank[sa[i]] = i;
    for(i = 0;i<n;i++){
        if(k)
            k--;
        j = sa[rank[i]-1];
        while(r[i+k] == r[j+k])
            k++;
        h[rank[i]] = k;
     }
}
int main(){
    while(scanf("%s",s) != EOF){
        int i,len1,len,res=0;
        len1 = (int)strlen(s);
        s[len1] = 'a'+26;
        scanf("%s",s+len1+1);
        len = (int)strlen(s);
        for(i = 0;i<len;i++)
            r[i] = s[i] - 'a' + 1;
        r[len] = 0;
        getsa(len+1,29);
        getlcp(len);
        for(i = 1;i<=len;i++)
            if(h[i]>res && ((sa[i]<len1&&sa[i-1]>len1)||(sa[i]>len1&&sa[i-1]<len1)))
                res = h[i];
            /*if(h[i]>res && ((sa[i]-len1)*(sa[i-1]-len1)<0))
                res = h[i];*/
        printf("%d\n",res);
    }
    return 0;
}


point transformer v3结构 分割结构: embedding->enc->dec embedding->enc0->enc1->enc2->enc3->enc4->dec3->dec2->dec1->dec0 embedding ->block0->block1 ->dow->block0->block1 ->dow->block0->block1 ->dow->block0->block1-&gt 阅读详情

相关推荐

ROS2_control 对机器人控制(不完整,有时间再更新)

会提示安装好其他相应的东西# 本来应该还要有ros-humble-gz-ros2-control,但是直接安装提示定位不到ros2 control --help # 输出 Commands:list_controller_types 输出可用的控制器类型及其基类list_controllers 输出已加载控制器的列表、类型和状态list_hardware_components 输出可用硬件组件列表list_hardware_interfaces 输出可用命令和状态接口列表。

m0_52113469的博客 2468

ACWING 799. 最长连续不重复子序列 (入门) (双指针算法)

https://www.acwing.com/problem/content/801/ #include<bits/stdc++.h> using namespace std; int book[100010]; int main() { int n; cin>>n; int a[n]; for(int i=0;i<n;i++) cin>>a[i]; int ans=0; for(int i=0, j.

这是博客描述 807

VTK基础教程(1)- vtkPolyData 介绍

目录 VTK的编译与环境搭建 VTK一般渲染流程 VTK数据类型-vtkPolyData 使用vtk自带的多边形数据 使用自己创建的数据 添加顶点颜色 添加面颜色 VTK的编译与环境搭建 这部分目前已经有了大佬做了成熟的傻瓜式配置,大家可以参考这篇文章:VTK+VS2019(或其他版本均可) 傻瓜式一站式 配置_Nancy_fairy的博客-优快云博客_vs2019 vtk VTK一般渲染流程 这部分的介绍也很多,大家可以参考这篇文章:VTK笔记-了解VTK_黑山老妖的博客.

qq_35769071的博客 9054

[算法笔记]最长公共连续子串

最长公共连续子串的动态规划思路以及一道例题解析

qq_39377889的博客 1370

告别WSL!实测AMD ROCm7预览版在Windows下跑ComfyUI,速度提升与避坑全记录

本文详细记录了在Windows原生环境下部署AMD ROCm7+PyTorch+ComfyUI的全流程,相比WSL环境性能显著提升。涵盖硬件兼容性确认、开发环境配置、Python环境搭建、ComfyUI部署优化及性能对比测试,为AI绘图爱好者提供实用指南。

weixin_42528090的博客 671

Android 13 内置xapk安装包的方法

安装xapk 内置xapk

安卓兼职framework和app工程师的博客 223

JAVA窗口sin值_大厂经典笔试题—LeetCode03无重复字符的最长子串(滑动窗口)

题目描述原创作者:bigsai,长期维护不易,如有收获还请点赞、收藏支持!题目描述:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"...

weixin_39960503的博客 251

LPDDR5 学习笔记01:功能概述

LPDDR5/LPDDR5X SDRAM设备采用8/16DQ通道架构,支持2Gb-32Gb容量。通过CK命令时钟和更快的WCK数据时钟协同工作,7个CA引脚传输控制信息,支持2:1或4:1的WCK:CK比例。设备提供BG/8B/16B三种存储模式选择,分别支持不同数据速率(最高8.533Gbps)和突发长度。采用0.5V VDDQ电源电压,实现高速双倍数据速率传输,并通过差分WCK时钟完成数据采样。读写采用突发访问机制,需先激活命令再执行读写操作。新型LPDDR5X仅支持BG和16B模式,优化了高速性能。

一只豌豆象的博客 2202

最长连续子串

链接:https://www.nowcoder.com/questionTerminal/276712b113c6456c8cf31c5073a4f9d7?orderByHotValue=1&amp;page=1&amp;onlyReference=false来源:牛客网牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度。输入描述:输入为两行字符串(可...

小冰球 2497

大数据学习指南从入门到精通

利用框架的力量,看懂游戏规则,才是入行的前提大多数人不懂,不会,不做,才是你的机会,你得行动,不能畏首畏尾选择才是拉差距关键,风向,比你流的汗水重要一万倍,逆风划船要累死人的为什么选择学习大数据开发,不选择Java开发?借棋弈做比喻,智商高的不要选择五子琪,要选择围棋,它能长久地吸引你。不都是在棋盘上一颗黑子一颗白子地下吗?因为围棋更复杂,能够掌握如此复杂的技艺、产生稳定输出的棋手、让我们更佩服。选择学习大数据开发也如此,能让你的职业生涯走得更远,少走弯路。

Lansonli(蓝深李)的博客 2万+

5 分钟上手 Kimi Work:安装、配置、跑通第一个任务

这篇文章提供了Kimi Work的快速入门指南,帮助用户在5分钟内完成从安装到运行第一个任务的全过程。主要内容包括: 安装步骤: macOS用户下载.dmg文件并拖入Applications Windows用户下载.exe安装包,需注意中文路径问题 初始设置: 使用现有Kimi账号登录 检查任务配额和文件访问权限 首个任务推荐: 建议从简单的本地文件整理开始(如按类型分类桌面文件) 详细说明了任务执行流程和审批机制 常见问题: 计划生成卡顿的解决方法 文件无变化的排查步骤 进阶建议: 提供难度递增的后续任务

sg_knight的专栏 2786

最长的公共连续子串

一、题目描述 两个字符串(可能包含空格),找出其中最长的公共连续子串, 并输出其长度。 二、解题思路 & 代码 创建一个二维数组 dp[n][m]dp[n][m]dp[n][m], 其中 dp[i][j]dp[i][j]dp[i][j] : 表示取到 s1[i]s1[i]s1[i] 和取到 s2[j]s2[j]s2[j] 时的最大连续子串长度。 如果 s1[i]s1[i]s1[i] 等于 s2[j]s2[j]s2[j],则 dp[i][j]dp[i][j]dp[i][j] 等于取到 s1[i−1]s

weixin_41888257的博客 863

DeepSeek如何构建可扩展的 AI 驱动交易系统,基于 MetaTrader 5 与 Python 利用先进的数据处理、机器学习和容器化部署来优化算法交易。

MT5 Python API 架构设计分为三层:通信层:利用异步消息传递(例如 ZeroMQ 或标准套接字编程)支持每秒数万个数据请求。转换层: C++ 动态库有效地将 MT5 命令转换为 Python 对象(反之亦然),从而优化速度和内存使用率。接口层:提供Pythonic API,封装了所有终端功能,包括:1)实时价格订阅(滴答或秒级更新)2)历史数据检索(从M1到更高的时间范围)3)订单流监控(交易详情和市场深度)4)策略执行引擎(用于算法交易)

iCloudEnd的博客 1382

后缀数组题集

POJ - 3261可重叠出现至少 kk 次的最大子串。取height数组上长度为 k−1k-1 区间的最值就行了。#include<cstdio> #include<algorithm> using namespace std; const int N = 2e4+7,M=1e6+7; int sa[N],c[M],t1[N],t2[N],rk[N],h[N],dp[N][20],mm[N]; i

On the way 348

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

POJ 2774 后缀数组 (求最长公共子串)

POJ—2774 最近在学后缀数组,学了两天看了很多篇讲解博客也没有完全懂,也有没理解的地方。看了其他博客的题解,我发现初学后缀数组大多都是这样,开始也不怎么理解,背模板,但是我认为题量上来了 见得多了,可能某一时刻突然就会豁然开朗,掌握了精髓。我认为这也是每个学习者的必经之路。 关于后缀数组的链接看了很多,看了几篇比较好的放在下面,我觉得百度百科讲的后缀数组也比较清楚,但是...

an94460061的博客 537

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

POJ 2774 Long Long Message(后缀数组[最长公共子串])

POJ 2774 Long Long Message(后缀数组[最长公共子串])

queuelovestack的专栏 1593

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

POJ 2774求两字符串的最长公共子串(后缀数组)

POJ 2774求两字符串的最长公共子串(后缀数组) 题目链接:传送门 思路: 大概就是枚举s2(s1)的每个后缀,查看对应的s1(s2)的后缀与自己的最长前缀长度是多少。 我们可以把字符串s1和s2拼接到一起,中间用’#‘连接(’#'只是代表比字符集任意一个字符小的字符),然后求出拼接后字符串的后缀数组,在排序后的后缀数组上排名从小到大遍历,并同时记下左边最近的s1(s2)的后缀的位置p1(p2...

Dch19990825的博客 319

POJ 2774 Long Long Message

POJ 2774 Long Long Message 题目链接 Description The little cat is majoring in physics in the capital of Byterland. A piece of sad news comes to him these days: his mother is getting ill. Being worried abo...

旺崽的博客 2592

poj 2774求两个串的公共前缀 后缀数组

// // main.cpp // 后缀数组 // // Created by liuzhe on 17/2/5. // Copyright © 2017年 my_code. All rights reserved. // #include #include #include #include #include using namespace std; //poj 2774后

The_star_is_at的博客 629

POJ2774 Long Long Message(后缀数组)

POJ2774 Long Long Message(后缀数组) 题目描述 The little cat is majoring in physics in the capital of Byterland. A piece of sad news comes to him these days: his mother is getting ill. Being worried about sp...

wondove 264

POJ2774(后缀数组 求两串最长公共子串)

后缀数组题集参考来自博客:博客 题目链接 Long Long Message 题意:给你两个字符串,求这两个字符串最长的公共子串 做法:后缀数组,构建sa数组 O(nlogn), 构建 height 数组O(n^2) 我们可以把两个串用一个特殊字符拼接,然后跑SA求出height,由于最长公共子串肯定是height中的某一个,而且要满足sa[i]和sa[i−1]分别属于两个串,所以只要跑一遍后缀数组遍历一遍height就好了。 #include<cstdio> #includ..

ccsu_deer 729

【POJ2774】后缀数组

【POJ2774】 题目大意 给定两个字符串a,b求它们的最长公共字串 len(a),len(b) &lt;= 1e5   分析 构造一个串s,s=a+'$'+b,这样可以保证s的后缀的LCP不会跨过a,b 那么公共字串就转化成了s的后缀的LCP 可以发现后缀排名离得越近的LCP就越长,那么答案就产生在height数组中 求出s的height[]和sa[] 答案就是MAX{ he...

Shelter 284

poj2774 后缀数组

/* poj2774 题意: 给两个字符串(长度不超过100000),求最长公共子串 用我学过的平常的暴力或kmp的方法都会超时,所以刚好可以用来 当做后缀数组的入门题 在下边借用一些论文里的知识再加上自己的一些理解 一、后缀数组的实现 后缀:就是从某个位置i开始到整个字符串末尾的特殊的字符串,用suffix(i)表示 大小比较:关于字符串的大小比较,是指通常所说的“字典顺序”比较,也 就是对于

wenzhunpu的专栏 494

poj 2774 //后缀数组

Long Long MessageTime Limit: 4000MS Memory Limit: 131072KTotal Submissions: 10928 Accepted: 4361Case Time Limit: 1000MSDescriptionThe little cat is majoring in physics in the capital of Byterland. A piece of sad news comes to him these days: his mother

hqd_acm的专栏 2367

poj 2774 后缀数组

后缀数组是字符串处理神器,可以解决多类字符串问题,这篇博客写的不错,转载一下:http://www.cnblogs.com/Lyush/archive/2013/08/02/3233573.html 简要来说,sa[i]是后缀排名第i位的起始位置,rank[i]是以第i位为起始位置的后缀的排名,正好和sa[i]相逆,也就是sa[rank[i]]=i,而height[i]存的是后缀sa[i]与sa

AngelBeats! 406

POJ 2774 Long Long Message 后缀数组

题目大意: 给出两个很长的串(长度分别 大致思路: 用后缀数组的话很明显是个水题,将两个串连起来中间用一个没有出现的值隔开然后求出后缀数组和height数组 找到sa[i]及sa[i - 1]来自不同的串的时候height数组的最大值即可 代码如下: Result  :  Accepted     Memory  :  5512 KB     Time  :  375

Gatevin的专栏 1072
上一篇: iTunes显示歌词
下一篇: poj 3522 二分+判图连通(最小Slim生成树)
dumeichen
博客等级 码龄13年 55粉丝 475原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值