hdu 1403 Longest Common Substring

本文探讨了使用后缀自动机解决求两个字符串的最长公共子串问题,并附上了详细的代码实现。作者在掌握了KMP和字典树的基础上,通过实践加深了对后缀自动机的理解。

我是不是真的需要学学后缀数组了,这个题我是用后缀自动机写出来的。写的比较辛苦吧,不过对后缀自动机的理解又进了一步。不废话了,题意是让你求两个字符串的最长公共子串的长度。

现在贴上我的代码:

View Code
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>

#include <map>

using namespace std;

const int maxlen=100000+5;

char s1[maxlen],s2[maxlen];
int cnt;

struct node
{
    int len;
    node *next[26];
    node *fail;
}memory[1000000];

node *createnode(int l,node *fail)
{
    node *p=&memory[cnt];
    memory[cnt].len=l;
    memory[cnt].fail=fail;
    memset(memory[cnt++].next,NULL,sizeof(node *)*26);
    return p;
}

class SAM
{
    public:
    node *root;
    SAM()
    {
        root=NULL;
    }
    void Insert(char *str)
    {
        if(!root)
            root=createnode(0,NULL);
        node *loca=root;
        for(int i=0;str[i];i++)
        {
            int num=str[i]-'a';
            if(loca->next[num]==NULL)
                loca->next[num]=createnode(i+1,NULL);
            loca=loca->next[num];
        }
    }
    void Build()
    {
        std::queue<node *>s;
        while(!s.empty())
            s.pop();
        s.push(root);
        while(!s.empty())
        {
            node *loca=s.front();
            s.pop();
            for(int i=0;i<26;i++)
            {
                if(loca->next[i]!=NULL)
                {
                    if(loca==root)
                        loca->next[i]->fail=root;
                    else
                    {
                        node *tmp=loca->fail;
                        while(tmp!=NULL)
                        {
                            if(tmp->next[i]!=NULL)
                                break;
                            tmp->next[i]=loca->next[i];
                            tmp=tmp->fail;
                        }
                        if(tmp==NULL)
                            loca->next[i]->fail=root;
                        else if(tmp->next[i]->len==tmp->len+1)
                            loca->next[i]->fail=tmp->next[i];
                        else
                        {
                            node *t=tmp->next[i];
                            node *nt=createnode(tmp->len+1,t->fail);
                            t->fail=loca->next[i]->fail=nt;
                            memcpy(nt->next,t->next,sizeof(node *)*26);
                            while(tmp&&tmp->next[i]==t)
                            {
                                tmp->next[i]=nt;
                                tmp=tmp->fail;
                            }
                        }
                    }
                    s.push(loca->next[i]);
                }
            }
        }
    }
    int maxCommonLen(char *s1,char *s2)
    {
        node *loca=root;
        int ans,len;
        ans=len=0;
        for(int i=0;s2[i];i++)
        {
            int num=s2[i]-'a';
            if(loca->next[num])
            {
                len++;
                loca=loca->next[num];
            }
            else
            {
                node *tmp=loca->fail;
                while(tmp&&!tmp->next[num])
                    tmp=tmp->fail;
                if(tmp)
                {
                    len=tmp->len+1;
                    loca=tmp->next[num];
                }
                else
                {
                    loca=root;
                    len=0;
                }
            }
            ans=(ans<len)?len:ans;
        }
        return ans;
    }
};




int main()
{
    while(~scanf("%s %s",s1,s2))
    {
        SAM sam;
        cnt=0;
        sam.Insert(s1);
        sam.Build();
        printf("%d\n",sam.maxCommonLen(s1,s2));
    }
    return 0;
}

之前自己曾在百度知道上面问了个问题,内容是,字符串的处理,我该怎么来学,前提我当时学会了kmp和字典树,回答是让我把ac自动机跟后缀数组再学一下。我真的需要学习一下后缀数组嘛?说实话我对后缀数组思路里面的那几个数组实在是不怎么感冒。所以就直接绕来学后缀自动机了。请大牛为我指条明路!

转载于:https://www.cnblogs.com/RainingDays/archive/2012/11/28/2792669.html

内容概要:本文详细介绍了一个基于MATLAB实现的SWT-SVM故障诊断分类预测项目,通过平稳小波变换(SWT)进行信号去噪与多尺度特征提取,结合支持向量机(SVM)实现机械设备故障的智能分类。项目涵盖从数据采集、预处理、SWT分解、特征提取与降维(如PCA)、模型训练与优化(含交叉验证、网格搜索、贝叶斯优化)、性能评估(混淆矩阵、ROC曲线、F1分数等)到结果可视化与GUI界面开发的完整流程。系统具备高可解释性、强鲁棒性和良好工程集成能力,适用于多行业设备健康监测,并提供完整的代码实现与部署方案。; 适合人群:具备一定MATLAB编程基础,熟悉信号处理与机器学习算法的高校研究生、科研人员及工业领域从事设备故障诊断、智能运维的工程师和技术人员。; 使用场景及目标:①应用于智能制造、风电、轨道交通、石化、航空航天等领域的设备故障早期检测与健康状态评估;②构建端到端的智能诊断pipeline,提升诊断准确率与自动化水平;③通过GUI交互界面实现数据导入、模型训练、实时预测与结果导出,服务于科研教学与工业实际部署。; 阅读建议:建议读者结合文中提供的完整MATLAB代码与GUI设计,逐步复现各模块功能,重点关注SWT参数选择、特征降维策略、SVM超参数优化及模型评估方法。在实践过程中调试信号处理流程与分类性能,深入理解算法原理与工程落地的关键环节。
【Copula光伏功率预测】基于单调广义学习系统(MBLS)和Copula理论的时空概率预测模型(Matlab代码实现)内容概要:本文介绍了一个基于单调广义学习系统(MBLS)和Copula理论的时空概率预测模型,用于光伏功率预测,并提供了Matlab代码实现。该模型结合了MBLS在函数逼近和学习能力方面的优势,以及Copula理论在处理多变量非高斯分布和捕捉变量间复杂相关性结构的能力,能够有效处理光伏出力的不确定性与时空相关性,从而提高预测精度和可靠性。此外,文档还列举了多个相关的科研方向和技术应用实例,如风电预测、虚拟电厂调度、风光制氢合成氨系统优化、多目标优化算法等,展示了其在电力系统、新能源、优化调度等多个领域的广泛应用前景。; 适合人群:具备一定编程基础,尤其是熟悉Matlab编程语言,从事新能源、电力系统、优化调度、机器学习等相关领域研究的科研人员和研究生。; 使用场景及目标:①应用于光伏发电功率的高精度时空概率预测,为电网调度、能源管理和市场交易提供决策支持;②作为研究Copula理论和MBLS算法在复杂非线性系统建模中应用的案例,促进相关算法的改进与创新;③结合文中提到的其他优化算法(如多目标优化、智能优化算法)和应用场景(如虚拟电厂、综合能源系统),构建更复杂的系统优化与决策模型。; 阅读建议:此资源不仅提供了具体的代码实现,还涵盖了丰富的科研背景和应用方向。建议读者在学习过程中,不仅要理解MBLS和Copula理论的核心思想与实现细节,还应结合文中提及的其他技术(如优化算法、深度学习模型)进行横向对比和综合应用,以拓宽研究视野。同时,鼓励读者基于提供的代码框架,针对具体问题进行参数调整和模型改进,通过实践加深对理论的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值