Hihocoder 1032 最长回文子串

本文详细阐述了如何使用动态规划算法解决回文串问题,包括暴力枚举、中心扩展和Manacher算法,并提供了C++源码实现。

题目链接:

http://hihocoder.com/problemset/problem/1032

题意:

求一个字符串中最大回文串的长度

思路:

回文串第一题,通过叙述思路来整理如何做好回文串题。

看到的博客上说有四种算法,分别是暴力枚举(n^3),动态规划(n^2),中心算法(n^2)manacher算法(n)

实现方式通过在相邻字符之间填充’#’的方法把字符串变为恒为奇数个字符的字符串,然后再开头插入’$’来防止溢出。dp[i]数组用于存储每个以i为中心的最大回文字符子串最右能到哪里,转换过来就是dp[i]-1是以i为中心的字符子串的最大长度。

下面开始叙述转移方程。设已经找到的最大字符子串的中心为id,它的右边界为mx。则有

dp[i] = gmin(dp[2*id-i],mx-i)。具体为:第一项dp[2*id-1]i关于id的对称点(因为从前向后遍历所以i关于id的对称点都在i的前面)。第二项为id为中心的最大字符子串(实际上也是目前找到的最大字符子串)的右边界到i的距离。dp[i]只更新到当前能更新的最大范围。到达顶端mx-i后,需要线性开始向后遍历(即增加dp[i]判断是否满足条件)。遍历结束更新idmx,同时进行i+1的判断。

准确说应该是一个2n的算法。

源码:

#include <cstdio>

#include <cmath>

#include <cstring>

#include <string>

#include <algorithm>

#include <iostream>

using namespace std;

#define gmin(a,b) a<b?a:b

#define gmax(a,b) a>b?a:b

const int MAXN = 1e6+5;

char str[MAXN],data[2*MAXN];

int dp[MAXN*2];

int main()

{

    int t;

    scanf("%d",&t);

    while(t--){

        scanf("%s",str);

        data[0] = '$';

        int len = strlen(str);

        for(int i=0; i<strlen(str); i++){

            data[i*2+1] = '#';

            data[i*2+2] = str[i];

        }

        data[len*2+1] = '#';

        data[len*2+2] = '\0';

        int id,mx;

        id = 0;

        mx = 1;

        int ans = 0;

        for(int i=0; i<2*len+1; i++)

            dp[i] = 1;

        for(int i=0; i<2*len+1; i++){

            int j = 2 * id - i;

            dp[i] = gmin(dp[j],mx-i);

            while(data[dp[i]+i] == data[i-dp[i]])

                dp[i]++;

            if(mx < dp[i]+i){

                mx = dp[i]+i;

                id = i;

            }

            ans = gmax(ans, dp[i]);

        }

//        printf("dp\n");

//        for(int i=0; i<2*len+1; i++)

//            printf("%d ",dp[i]);

        printf("%d\n",ans-1);

    }

    return 0;

}

 

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值