SPOJ - LCS Longest Common Substring 求2个字符串的最长公共子串

[SPOJ1812]LCS2 - Longest Common Substring II 后缀自动机 阅读详情

题目:求2个字符串的最长公共子串的长度

思路:对str1建立后缀自动机,然后让str2去跑

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<list>
#include<numeric>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define PP puts("*********************");
template<class T> T f_abs(T a){ return a > 0 ? a : -a; }
template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
// 0x3f3f3f3f3f3f3f3f

const int MAXN = 500050, SIZE = 26;
struct SAM {
    int len[MAXN], link[MAXN], next[MAXN][SIZE];
    int total, last;
    inline int newNode(int L) {
        len[++total] = L; link[total] = 0;
        for(int i = 0; i < SIZE; ++i) next[total][i] = 0;
        return total;
    }
    inline void Add(int c) {
        int i, p = last, cur = newNode(len[last] + 1);
        for(; p && !next[p][c]; p = link[p]) next[p][c] = cur;
        if(!p) link[cur] = 1;//令其指向初始状态
        else {
            int q = next[p][c];
            if(len[q] == len[p] + 1) link[cur] = q;
            else {//>
                int clone = newNode(len[p] + 1);
                for(i = 0; i < SIZE; ++i) next[clone][i] = next[q][i];
                link[clone] = link[q];
                link[q] = link[cur] = clone;
				for(; p && next[p][c] == q; p = link[p]) next[p][c] = clone;
            }
        }
        last = cur;
    }
    void Init () {//根节点是1
        total = 0;
        last = newNode(0);
    }
}sam;
char str1[MAXN],str2[MAXN];
int main(){

    while(~scanf("%s%s",str1,str2)){
        sam.Init();
        for(int i=0;str1[i]!='\0';i++)
            sam.Add(str1[i]-'a');
        int ans=0,len=0,now=1;
        for(int i=0;str2[i]!='\0';i++){
            int c=str2[i]-'a';
            if(sam.next[now][c]){
                len++;
                now=sam.next[now][c];
            }
            else{
                while(sam.next[now][c]==0&&now!=0)
                    now=sam.link[now];
                if(now==0){
                    now=1;
                    len=0;
                }
                else{
                    len=sam.len[now]+1;
                    now=sam.next[now][c];
                }
            }
            ans=max(ans,len);
        }
        printf("%d\n",ans);
    }
    return 0;
}



最大公共字符串leetcode-longest-palindromic-substring:给定一个字符串s,找出s中最长的回文子串。你可以假 最大公共字符串leetcode 最长回文子串 给定一个字符串 s,找出 s 中最长的回文子串。 您可以假设 s 的最大长度为 1000。 示例 1: Input: "babad" Output: "bab" Note: "aba" is also a valid answer. 示例 2: Input: "cbbd" Output: "bb" 蛮力解决方案,对于每个可能的子串,检查它是否是回文。 O(n^3) public String solve(String s) { if(s.length() < 2) { return s; } String max = ""; for (int i = 0, length = s.length()+1; i < length; i++) { for (int j = i+1; j < length; j++) { if(max.length() < s.substring(i, j).length() && isPalindrome(s.substring(i, j))) { max = s.substring(i, j); } } } re 立即下载

相关推荐

c++编程上机测试算法总结

以前考试总结的,大部分是一些oj上的截图例子,偏向个人化,不一定非常有参考价值

最长共同子序列 (Longest Common SubsequenceLCS)

1. 最长共同子序列 (Longest Common Subsequence; LCS) 给定两个序列,找出两个序列中存在的最长子序列的长度。子序列是指以相同的相对顺序出现,但不一定是连续的序列 称为「最长共同子序列」(Longest Common Subsequence; LCS)」 示例: 序列“ ABCDGH”和“ AEDFHR”的LCS为长度3的“ ADH”。 序列“ AGGTAB”和“ GXTXAYB”的LCS为长度4的“ GTAB”。 解题思路 首先看一个2个字符串abcdefg和c

u011342224的博客 1648

STM32--基于STM32F103C8T6的OV7670摄像头显示

使用 STM32F103C8T6 微控制器驱动 OV7670 摄像头模组,并将图像数据显示在屏幕上,是嵌入式系统中常见的图像采集与显示应用。OV7670 是一款 CMOS VGA 图像传感器,具有高灵敏度、低电压等特点,适用于嵌入式应用。而 STM32F103C8T6 是一款常用的 MCU 控制器,具有丰富的管脚资源和较高的工作频率。

duierrorshuobu的博客 2145

编辑距离:最长公共子序列-LCS问题

最长公共子序列(LCS)问题是在一组序列(通常只有两个序列)中找到所有序列共有的最长子序列的问题。它与最长公共子串问题不同:与子串不同,子序列不需要占据原始序列中的连续位置。最长公共子序列问题是经典的计算机科学问题,是 diff 实用程序等数据比较程序的基础,在计算语言学和生物信息学中有应用。它还被 Git 等版本控制系统广泛用于协调对受版本控制的文件集合所做的多项更改。 例如,考虑序列 (ABCD) 和 (ACBAD)。它们有 5 个长度为 2 的公共子序列:(AB)、(AC)、(AD)

gongdiwudu的专栏 7111

Dify社区版多工作空间功能解锁:源码修改与多租户架构解析

多租户架构是现代SaaS平台实现数据隔离与资源管理的核心技术,其核心原理是通过租户模型将用户、应用和数据在逻辑上隔离。在AI应用开发平台中,这种架构能有效支持多团队、多项目并行开发,确保不同业务线的数据安全与独立迭代。Dify作为开源AI应用构建平台,其底层已设计完善的多租户模型,但社区版默认限制了单用户单工作空间。本文通过精准修改两处关键代码——账户初始化逻辑与系统功能开关,释放了平台固有的多工作空间管理能力。该方案无需改动数据库结构,直接利用现有RBAC权限体系,实现了类似企业版的**多租户隔离**体验

weixin_27059669的博客 1055

[原创]Step by step 实现自己的AI知识库问答(二)

对小白很友好的AI智能问答开发保姆级教程,适合初级开发者、学生阅读参考,无限制分享,欢迎转载。在这个章节中,我们使用了百度千帆作为知识库,通过简单的代码调用API实现了智能问答。

BaiRiYiSanJin的博客 1470

求两个字符串的最长公共子序列Longest Common Sequence(LCS)

题目分析: 首先需要理解题目中几个名词的含义。 (1)子序列的含义:一个序列S,任意删除若干个(可为0个)字符后得到的序列C,则C称为S的子序列 (2)最长公共子序列定义为两个序列的公共子序列中最长的一个或若干个。 (3)任意两个序列X和Y,至少存在一个公共子序列&quot;空&quot;,即‘’。 假设已知给定的序列为X和Y,长度分别为m和n。 解法1:暴力穷举法 思路:因为要求的是两个串X和Y的最长公共子序列,因...

代码 3964

ASP.NET Core Identity + Mysql(实战一)——注册登陆

在进行实战之前,我们先来了解一下Identity。 ASP.NET Core Identity是用于构建ASP.NET Core Web应用程序的成员资格系统,包括成员资格、登录和用户数据存储。简单的来讲包括: 1.用户数据存储(使用任意你喜欢的关系型数据库,从sqllite到mysql、sqlserver等等,由Entity Framwork 支持) 2.登陆、注册外加身份认证(基于coo...

weixin_40359716的博客 1398

求两个字符串的最长公共子序列(LCS)

求两个字符串的最长公共子序列(Longest common subsequence) Given two sequences.Find the length of the longest common subsequence(LCS) Note: A subsequence is different from a substring ,for the former need NOT be cons...

Chauncy的博客 1211

Python 爬虫实战:美团大众点评餐厅数据爬取与分析

本文摘要:美团/大众点评餐厅数据爬虫实战指南 本文详细介绍了如何开发一个完整的餐厅数据爬虫系统,涵盖从环境配置到数据可视化的全流程。主要内容包括: 项目目标:爬取餐厅基本信息(名称、评分、价格等)及详情数据,支持市场分析和商业决策 技术方案:使用Python生态工具(Requests、Playwright、Pandas等)构建爬虫系统 核心挑战:破解大众点评的字体反爬机制和美团的API签名验证 实现细节:提供完整的代码示例,包括字体解析、签名生成、请求重试等关键功能 数据应用:支持将结果导出为CSV/Exc

u014481728的博客 308

SAP UI5 百科全书的目录

笔者 12 年 SAP UI5 开发岁月中写下的 595 篇 SAP UI5 学习笔记,全部收录到《SAP UI5 百科全书》专栏中去,目录如下。请大家按照自己的学习需要,根据关键字搜索到对应的文章,然后进行学习。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3825

LCS的java算法---考虑可能有多个相同的最长公共子串

 LCS(Longest Common Subsequence) 就是求两个字符串最长公共子串的问题。比如:  String str1 = new String("adbccadebbca");  String str2 = new String("edabccadece");str1与str2的公共子串就是bccade.    解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之

消逝的地平线 7757

用miniconda建立PyTorch、Keras、TensorFlow三个环境

如果还没有安装Miniconda,请从[Miniconda官网](https://docs.conda.io/en/latest/miniconda.html)下载合适的版本并进行安装。如果遇到问题,可以通过编辑`~/.condarc`文件来临时禁用某个源,或者通过`conda config --remove channels`命令来移除配置的镜像源。要切换到不同的环境,先使用`conda deactivate`命令退出当前环境,再用`conda activate 环境名称`命令激活另一个环境。

数字人生 2464

SPOJ LCS2 1812. Longest Common Substring II

SPOJ Problem Set (classical) 1812. Longest Common Substring II Problem code: LCS2 A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is

码代码的猿猿 1950

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

SPOJ LCS2 Longest Common Substring II

SPOJ LCS2 Longest Common Substring II后缀自动机题意给出若干串,求所有串的最长公共子串。思路SAM。 对于第一个串建SAM,用后面的串在上面跑。开个数组统计每个状态的最大长度,每个字串搞完了后合并到一个新数组上。合并每个字串的长度时各字串之间取min。最后统计每个状态的max即可。然后WA。。。因为每个可匹配的状态x的前驱状态y也是可以匹配的。。但是在自动机上跑

P.H.S 269

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

spoj 1812 LCS2 - Longest Common Substring II (后缀自动机)

spoj 1812 LCS2 - Longest Common Substring II 题意: 给出最多n个字符串A[1], ..., A[n], 求这n个字符串的最长公共子串。 限制: 1 |A[i]| 思路: 和spoj 1811 LCS差不多的做法 把其中一个A建后缀自动机 考虑一个状态s, 如果A之外的其他串对它的匹配长度分别是a[1], a[2],

whai的专栏 1237

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

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

SPOJ - LCS2 Longest Common Substring II(求多个串的最长公共子串)

A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also called factor, is a consecutive sequence of characters oc...

bravo的博客 426

SPOJ-LCS2 Longest Common Substring II

题目连接: https://vjudge.net/problem/SPOJ-LCS2 Description A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also call...

weixin_30641465的博客 133

SPOJ - LCS2 Longest Common Substring II

SPOJ - LCS2 Longest Common Substring II (后缀自动机)

Insist111 270

Longest Common Substring II(SAM——多个字符串的最长公共子串)

https://cn.vjudge.net/problem/SPOJ-LCS2 A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also called factor, i...

永夜莫明的博客 942

SPOJ - LCS Longest Common Substring 后缀自动机最长公共子串

题目链接:https://cn.vjudge.net/problem/SPOJ-LCS 题意:s, t 两串的最长公共子串 题解:s建树,枚举 t ,失配后通过回溯fa[],来继续进行 后缀自动机:https://blog.youkuaiyun.com/mmk27_word/article/details/98475090 #include <bits/stdc++.h> using n...

还我笑颜 366

SPOJ LCS2 Longest Common Substring II 后缀自动机

题目大意: 就是现在给出最多10个长度不超过10^5的字符串, 求这10个串的最长公共字串的长度 大致思路: 这是SPOJ LCS那题的升级版, 那道题我是将所有串连接起来中间用没有出现过的字符隔开然后整体建立后缀自动机然后对于每个点上状压记录Right集合当中元素的来源来做的 但是这个题这么做会TLE, 虽然复杂度也是O(n)的, 但是这个题的时间限制很紧 所以后来换了一个方法

Gatevin的专栏 968

SPOJ - LCS2 Longest Common Substring II 多个串的最长公共子串

题目:求多个串的最长公共子串 思路:对第一个串建立SAM,其余的串在上面跑,与求2个串的最长公共子串不同的是,当跑到p时,还要更新link[p] 代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include #include #include #include #include #include #include #

ACVevtor的博客 432

[Longest Common Substring II] SPOJ - LCS2

题意: 求n个字符串的最长公共子串的长度 题解: 这个题可以类比只有两个字符串的情况来做。 我们仍然选择对第一个字符串建立SAM,然后对于其他串在SAM上匹配,过程中记录一下每个字符串到达SAM中某个节点时的长度,对于每个状态取minminmin,然后从最小值中选取最大值即为答案。 ACACAC代码: #include<bits/stdc++.h> using namespace st...

qq_43544481的博客 204

SPOJ-LCS Longest Common Substring

题目连接: https://vjudge.net/problem/SPOJ-LCS2 Description A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the set of lowercase letters. Substring, also call...

weixin_30381317的博客 148
上一篇: HDU - 4426 Palindromic Substring
下一篇: SPOJ - LCS2 Longest Common Substring II 多个串的最长公共子串
我不会额
博客等级 码龄11年 2粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值