poj(2774)后缀数组法求公共连续…

本文介绍如何使用后缀数组和基数排序算法来寻找两个字符串之间的最长连续公共子串。通过连接字符串并添加特殊分隔符确保最长公共子串跨越两个原始字符串。文章详细解释了后缀数组构建过程及其在解决此问题中的应用。

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

题目原意:输入两个字符串,求最长的连续公共子串的长度;
看了好长时间时间这个题,要用到后缀数组,于是下了个模板基数排序求后缀数组AC的。将两个字符串连接起来(模板里的基数排序求后缀数组要用int型,so将每个字符转换成整形),为了使得出现最长的公共子串在前后两部分里面,所以中间加个不可能出现的值(随意);然后将求最长公共子串(同时要判断的是公共子串的开头是否在两个区域OK了)。


#include<iostream>
#include<string>
using namespace std;
const int MAX = 200100;

int n, num[MAX];
int sa[MAX], rank[MAX],height[MAX];//sa[i]表示排名第i的后缀的位置,height[i]表示后缀SA[i]和SA[i-1]的最长公共前缀
int wa[MAX], wb[MAX], wv[MAX], wd[MAX];//基数排序模板不要修改

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

void da(int *r, int n, int m)          // 倍增算法0(nlgn)。
{
    int i, j, p, *x = wa, *y= wb, *t;
    for(i = 0; i< m; i ++) wd[i] = 0;
    for(i = 0; i< n; i ++) wd[x[i]=r[i]] ++;
    for(i = 1; i< m; i ++) wd[i] += wd[i-1];
    for(i = n-1; i>= 0; i --) sa[-- wd[x[i]]] = i;
    for(j = 1, p = 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 ++) wv[i] =x[y[i]];
       for(i = 0; i < m; i ++) wd[i] =0;
       for(i = 0; i < n; i ++) wd[wv[i]]++;
       for(i = 1; i < m; i ++) wd[i] +=wd[i-1];
       for(i = n-1; i >= 0; i --) sa[--wd[wv[i]]] = y[i];
       for(t = x, x = y, y = t, p = 1, x[sa[0]] = 0, i= 1; i < n; i ++)
       {
           x[sa[i]] =cmp(y, sa[i-1], sa[i], j) ? p - 1: p ++;
       }
    }
}

void calHeight(int *r, int n)          // 求height数组。
{
    int i, j, k = 0;
    for(i = 1; i<= n; i ++) rank[sa[i]] = i;
    for(i = 0; i< n; height[rank[i ++]] = k)
    {
       for(k ? k -- : 0, j = sa[rank[i]-1]; r[i+k] ==r[j+k]; k ++);
    }
}

int main()
{
    int i=0, m;
    string s1;
    string s2;
   cin>>s1>>s2;
    for(intj=0;j<s1.size();j++)
    {
       num[i++]=s1[j]-'a'+10;
    }
    num[i++]=1;
    for(intj=0;j<s2.size();j++)
    {
       num[i++]=s2[j]-'a'+10;
    }
    m = 40;
    //在num[]中(结尾或中间)增加分隔符。*:需开始时就清晰da(num, n, m)之后的sa[]数组。
    n=i-1;
    //num[]每个元素都小于m。*:n+1为加了1个分隔符后的总长度。
    da(num, n + 1, m);
    calHeight(num, n);
    int ans=0;
    for(inti=2;i<=n;i++)
    {
       if(height[i]>ans)
       {
          if((sa[i]<s1.size()&&sa[i-1]>s1.size())||(sa[i-1]<s1.size()&&sa[i]>s1.size()))
          ans=height[i];
       }
    }
   cout<<ans<<endl;
    return 0;
}

内容概要:本文从关键概念、核心技巧、应用场景、代码案例分析及未来发展趋势五个维度探讨了Python编程语言的进阶之路。关键概念涵盖装饰器、生成器、上下文管理器、元类和异步编程,这些概念有助于开发者突破基础认知的核心壁垒。核心技巧方面,介绍了内存优化、性能加速、代码复用和异步处理的方,例如使用生成器处理大数据流、numba库加速计算密集型任务等。应用场景展示了Python在大数据处理、Web开发、人工智能和自动化运维等多个领域的广泛运用,特别是在FastAPI框架中构建异步API服务的实战案例,详细分析了装饰器日志记录、异步数据库查询和性能优化技巧。最后展望了Python的未来发展趋势,包括异步编程的普及、类型提示的强化、AI框架的深度整合以及多语言协同。 适合人群:已经掌握Python基础语,希望进一步提升编程技能的开发者,特别是有意向从事数据科学、Web开发或AI相关工作的技术人员。 使用场景及目标:①掌握Python进阶概念和技术,如装饰器、生成器、异步编程等,提升代码质量和效率;②学习如何在实际项目中应用这些技术,如通过FastAPI构建高效的异步API服务;③了解Python在未来编程领域的潜在发展方向,为职业规划提供参考。 阅读建议:本文不仅提供了理论知识,还包含了丰富的实战案例,建议读者在学习过程中结合实际项目进行练习,特别是尝试构建自己的异步API服务,并通过调试代码加深理解。同时关注Python社区的发展动态,及时掌握最新的技术和工具。
内容概要:本文档《Rust系统编程实战》详细介绍了Rust在系统编程领域的应用,强调了其内存安全、零成本抽象和高性能的特点。文档分为三个主要部分:核心实战方向、典型项目案例和技术关键点。在核心实战方向中,重点讲解了unsafe编程、FFI(外部函数接口)和底层API调用,涉及操作系统组件开发、网络编程、设备驱动开发、系统工具开发和嵌入式开发等多个领域,并列出了每个方向所需的技术栈和前置知识。典型项目案例部分以Linux字符设备驱动为例,详细描述了从环境搭建到核心代码实现的具体步骤,包括使用bindgen生成Linux内核API的Rust绑定,定义设备结构体,以及实现驱动核心函数。 适合人群:对系统编程有兴趣并有一定编程基础的开发者,尤其是那些希望深入了解操作系统底层机制、网络协议栈或嵌入式系统的工程师。 使用场景及目标:①掌握Rust在不同系统编程场景下的应用,如操作系统组件开发、网络编程、设备驱动开发等;②通过实际项目(如Linux字符设备驱动)的学习,理解Rust与操作系统内核的交互逻辑;③提高对unsafe编程、FFI和底层API调用的理解和运用能力。 阅读建议:由于文档内容较为深入且涉及多个复杂概念,建议读者在学习过程中结合实际操作进行练习,特别是在尝试实现Linux字符设备驱动时,务必按照文档提供的步骤逐步进行,并多加调试和测试。
内容概要:本文针对现有配电网灵活性评估方对网络传输能力考虑不足的问题,提出了一种新的评估方。该方首先建立了配电网灵活性供需模型,分析了4种供需匹配情况,接着提出3类灵活性评估指标,构建了以运行成本最低为目标的优化调度模型。通过改进的IEEE33节点配电网仿真验证了方的有效性。重点解决了高比例分布式电源接入带来的波动性问题,为配电网灵活性评估提供了新思路。文中还详细介绍了MATLAB代码实现,涵盖参数初始化、灵活性需和供给计算、评估指标计算、优化调度模型及可视化结果等方面。此外,对灵活性供需匹配的4种情况进行深入分析,并扩展实现了完整的灵活性评估系统,增加了动态时间尺度、增强可视化和实用扩展等功能,提升了系统的可扩展性和实用性。; 适合人群:从事电力系统研究、配电网规划与运营的专业人士,特别是关注分布式电源接入和电网灵活性评估的研究人员和技术人员。; 使用场景及目标:①评估含高比例分布式电源的配电网灵活性,解决DG接入带来的波动性问题;②通过优化调度模型最小化运行成本,提高配电网的运行效率;③利用扩展实现的系统进行多时间尺度仿真和不同场景下的对比分析,支持实际工程应用。; 其他说明:此资源不仅提供了详细的理论分析和MATLAB代码实现,还通过模块化设计增强了代码的可扩展性和实用性。建议读者结合具体配电网参数调整设备容量约束,根据当地电价政策优化成本系数,并采用历史数据训练更精确的场景生成模型。同时,可以通过并行计算加速仿真过程,采用交叉验证和蒙特卡洛仿真验证结果的稳定性和鲁棒性。
内容概要:该论文基于SIMULINK平台,通过构建单机无穷大系统和三机电力系统模型,研究了电力系统在大扰动下的暂态稳定特性。通过观察电动机电磁功率、机械功率和转速波形,分析了故障切除前后系统的动态行为。结果表明,系统复杂度与暂态稳定性密切相关,快速切除故障是维持系统稳定的关键。单机系统仿真验证了快速切除故障的有效性,而三机系统进一步揭示了多机系统中复杂的暂态特性。此外,论文还探讨了LED/LD驱动电源的设计优化,提出了基于GaN器件的高频驱动电路和ZVS控制算,并通过STATCOM等FACTS设备增强了电力系统的暂态稳定性。 适合人群:电气工程及相关领域的研究人员、研究生,特别是从事电力系统暂态稳定性和电力电子设计的工程师。 使用场景及目标:①理解单机和多机电力系统在故障条件下的暂态稳定特性;②掌握基于SIMULINK的电力系统建模和仿真的方;③学习LED/LD驱动电源的优化设计,包括GaN器件的应用和ZVS控制算的实现;④了解FACTS设备如STATCOM在提高电力系统暂态稳定性中的作用。 阅读建议:本文内容涵盖电力系统暂态稳定性和LED驱动电源设计两个方面,读者应重点关注SIMULINK模型的构建和仿真结果分析,同时结合提供的MATLAB代码进行实践操作,以便更好地理解理论与实际应用的结合。对于电力电子部分,建议结合实际应用场景理解GaN器件和ZVS控制算的优势。
管理员功能需 用户管理 查看用户列表:显示所有用户基本信息 添加用户:支持输入新用户信息并保存至数据库 修改用户信息:支持选择用户并更新其信息 删除用户:支持从数据库中删除选定用户 实习报告成绩管理 查看实习报告列表:显示所有学生实习报告 批阅实习报告:支持选择报告并给出批阅意见和评分 查看实习成绩列表:显示所有学生实习成绩 录入实习成绩:支持选择学生并输入成绩 修改实习成绩:支持更新学生实习成绩 通知公告管理 发布通知公告:支持输入通知内容并发布至系统 管理通知公告:支持查看、编辑和删除已发布通知 教师功能需 学生管理 查看所指导学生列表:显示教师负责的所有学生 查看学生实习情况:支持查看学生实习岗位、日志、报告等 实习报告批阅成绩录入 查看待批阅报告列表:显示教师待批阅的实习报告 批阅报告:支持选择报告并给出批阅意见和评分 通知公告查看 查看系统通知公告:显示系统发布的所有通知和公告 实习岗位管理 发布实习岗位:支持输入岗位信息并发布至系统 编辑实习岗位:支持更新已发布岗位信息 删除实习岗位:支持从系统中删除选定岗位 学生功能需 个人信息管理 查看个人信息:显示学生基本信息 修改个人信息:支持更新学生信息 实习岗位查询与申请 查询实习岗位:显示所有可用实习岗位 申请实习岗位:支持选择岗位并提交申请 实习日志提交 提交实习日志:支持输入日志内容并提交至系统 查看实习日志:显示学生提交的实习日志 实习报告提交 提交实习报告:支持输入报告内容并提交至系统 查看实习报告:显示学生报告及批阅意见 通知公告查看 查看系统通知公告:显示系统发布的所有通知和公告
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值