hdu 3068(扩展KMP)

麒麟linux离线源码编译安装zabbix-agent 离线源码编译安装zabbix-agent 阅读详情

//http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474 一个奇妙的o(n)算法,明天看看~~

看完结果总结如下:

  算法大致过程是这样。先在每两个相邻字符中间插入一个分隔符,当然这个分隔符要在原串中没有出现过。一般可以用‘#’分隔。这样就非常巧妙的将奇数长度回文串与偶数长度回文串统一起来考虑了(见下面的一个例子,回文串长度全为奇数了),然后用一个辅助数组P记录以每个字符为中心的最长回文串的信息。P[id]记录的是以字符str[id]为中心的最长回文串,当以str[id]为第一个字符,这个最长回文串向右延伸了P[id]个字符。
原串: w aa bwsw f d
新串: # w # a # a # b # w # s # w # f # d #(转载)
辅助数组P: 1 2 1 2 3 2 1 2 1 2 1 4 1 2 1 2 1 2 1
这里有一个很好的性质,P[id]-1就是该回文子串在原串中的长度(包括‘#’)。

 另外法是线性从前往后扫的。那么当我们准备求P[i]的时候,i以前的P[j]我们是已经得到了的。我们用mx记在i之前的回文串中,延伸至最右端的位置。同时用id这个变量记下取得这个最优mx时的id值。

hdu <wbr>3068
   

 

 另附上ac代码 没有我自己想出来的速度快。

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAX 230000
char  str[MAX],s[MAX];
long p[MAX];
long max(long a,long b){
   if(a > b) return a; return b;
}
long min(long a,long b){
   if(a > b) return b; return a;
}
void Change(){
    s[0]='$';
    s[1]='#';
    int len ;
    len = strlen(str);
    for(int i = 0 ; i < len ; i++)
    {
      s[2*i+2] = str[i];
      s[2*i+3] = '#';
    }
     s[2*len+2] ='\0';
 
}
void slove(){
    int len = strlen(s);
    long i , mx = 0, ans =-1, id=0 ;
    memset(p,0,sizeof(p));
    for( i = 0 ; i < len ; i++){
        if ( i > id)
         p[i] =min(p[2*id-i],mx-i);
        else
         p[i] = 1;
        for(;s[i-p[i]] == s[i+p[i]] ; p[i]++);
        if(p[i]+i>mx){
            id = i;
            mx =p[i]+i;
        }
        // printf("%ld ",p[i]);
         ans = max(ans,p[i]);
    }
    printf("%ld\n",ans-1);
}
int main()
{
    while(scanf("%s",str)!=EOF)
    {
        Change();
        slove();
    }
    fclose(stdin);
    return 0;
}

 

 

很开心很久没有自己a出题目来了,暑假第一道题,(*^__^*) 嘻嘻…… hdu3068
    本题目是一个回文的动态规划的题目,回文主要是两种情况,一种是奇数的回文,一种是偶数的回文,然后只要分类去写动态规划式子
    如果用odd【i-1】,even【j-1】分别来表示奇数和偶数的以str【i-1】为结尾的最长的子串,如果为奇数,便是以str【i】结尾,加上str【i-1】的最长奇数字串
    ,在加上与str【i】相等的头结点,就是str【i】为结尾的最长字串
    主要思想就是将回文分成奇数和偶数,然后去推导,分别计算结果就可以了。

#include <iostream>
#include <string.h>
#include <stdio.h>
#define MAX 110009
using namespace std;

int main()
{
    int i,j,num,ans;
    char str[MAX],ch;
    int  odd[MAX],even[MAX];

    while(scanf("%s",str)!=EOF)
    {
        ans = 1;
        odd[0]=1;
        even[0]=0;

        int len=strlen(str);
        for( i = 1 ; i < len ; i++ )
        {
            num=odd[i-1];
            for( j = num + 1 ; j >= 0 ;)
            {
                if( i - j  >= 0 && str[i] == str[i-j])
                {
                    odd[i] = j+1 ;
                    if( odd[i] > ans ) ans = odd[i];
                    break;
                }
                j = j - 2 ;
            }

            num = even[i-1];
            for( j = num + 1 ; j >= 0; )
            {
                if(i - j >= 0 && str[i] == str[i-j])
                {
                    even[i ] = j + 1 ;
                    if( even[i] > ans) ans = even[i];
                    break;
                }
                j = j - 2 ;

            }
            if( j == -1 ) even [i] = 0;

        }

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


    }

    return 0;
}

另一个版本:

Problem : 3068 ( 最长回文 )     Judge Status : Accepted
RunId : 6255711    Language : C++    Author : ssun
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
#include "stdio.h"
#include "string.h"
#define N 2200050


char str[N],nstr[2*N];
int rad[2*N];
int len,nlen;


int manacher(){
    int id, i, ans = 1;
    int mx = 0;
//    printf("%d",strlen(nstr));
    for(i=1; i<nlen; i++){//$#1#2#3#3#2#1#不要用strlen(nstr)代替nlen
        if(mx > i)
            rad[i] = mx - i < rad[2*id-i] ? mx - i : rad[2*id-i];
        else
            rad[i] = 1;
        for(;nstr[i+rad[i]] == nstr[i-rad[i]];rad[i]++)
            ;


        if(rad[i] + i > mx){
            mx = rad[i] + i;
            id = i;
        }


        ans = rad[i] > ans ? rad[i] : ans;
    }
    return ans-1;
}


int main(){
    while(scanf("%s",str)!=EOF){
        int i=0;
//        memset(rad,0,sizeof(rad));
        nstr[0] = '$';
        nstr[1] = '#';
        len = strlen(str);
        for(i=0; i<len; i++){
            nstr[2*i+3] = '#';
            nstr[2*i+2] = str[i];            
        }
        nstr[2*i+2] = 0;
        nlen = 2 * len + 2;
        printf("%d\n",manacher());
    }
    return 0;
}

攻防世界 misc题GFSJ1129-【您看我还有机会吗?】 我们发现了隐藏内容,一开始我以为那个英文就是flag,提交后发现不对,然后我想只有一张图片然后图片上的隐写内容又不是flag,那必定还有什么文件被隐藏了,于是我们打开VMware并启动Ubuntu,使用binwalk分析一下有没有隐藏文件,我们要在Terminal中分析,如下。我们发现里面有一个flag.txt文件,我们尝试提取里面内容,但发现又要密码,我们想起了之前图片上的隐藏内容,我们将那段英文输入(包括空格和符号,在VMware中输入密码不会有显示,你看到的就像没输入一样),然后我们看到如下。 阅读详情

相关推荐

Keil C51里用printf打印数据,为啥总出乱码?手把手教你%bd、%hd、%ld的正确用法

本文深入解析Keil C51中printf打印数据出现乱码的根本原因,并提供格式符%bd、%hd、%ld的正确用法指南。通过详细的调试技巧和实战案例,帮助开发者解决串口输出问题,提升单片机开发效率。

weixin_26854829的博客 281

浅谈扩展KMP算法

前言首先,kmp算法大家都知道,但是听到扩展kmp的时候,会想到底是干什么的? 那么扩展kmp算法是用来求解下面问题的: 给定母串S,和子串T。 定义n=|S|n=|S|, m=|T|m=|T|,extend[i]=S[i..n]extend[i]=S[i..n]与T的最长公共前缀长度。请在线性的时间复杂度内,求出所有的extend[1..n]extend[1..n]。 我们其实可以知道

farandnear的博客 798

mysql数据目录迁移后表不存在_mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法...

补充:正常情况下,建议数据库备份最好用工具进行备份,通过拷贝数据库表进行数据迁移,不同的环境会出现各种不同的意外问题。背景:今天在整理一个网站的时候,操作系统由于系统自动更新导致一直出现系统蓝屏死机,唉,悲剧了,于是重新安装了系统 windows server 2008 enterprise 32bit。详情:系统安装完成后,重新配置之前那个网站,appache服务配好之后,再配置数据的时候是这样...

weixin_39628271的博客 2673

Hdu3068最长回文(扩展kmp)

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中

787

PackML工业标准解析:统一机器状态管理与数据交换的实践指南

在工业自动化与智能制造领域,实现设备间的互联互通与高效协同是核心挑战。这背后依赖于一套标准化的机器行为与数据交换规范,其原理在于通过定义统一的状态模型与接口协议,消除不同厂商设备间的“语言”隔阂。这项技术的核心价值在于大幅降低系统集成复杂度、提升运维效率与生产透明度,是构建数字化工厂的基石。其典型应用场景包括包装机械、离散制造产线等需要多设备协同的领域。本文聚焦的PackML(包装机械语言)标准,正是这一理念的杰出实践,它通过一套严谨的**状态机模型**和**数据标签(PackTags)** 体系,为机器提

weixin_30070339的博客 401

解决uc浏览器劫持video标签问题

解决uc视频悬浮播放 ,video标签被浏览器劫持 ,vide0适配

smile_y_y的博客 3449

hdu3068

此题和上一题ural1297一样,但是用后缀数组的过不去 后缀数组+rmq是O(nlogn)的复杂度啊可见有多大的数据啊。。 要用O(n)的算法。用O(n)只要300多ms我还用了cin cout  差太多了 http://blog.youkuaiyun.com/tanhaiyuan/article/details/7091019介绍这个Manacher算法

lyc 1125

【06】C#入门到精通——C# 多个 .cs文件项目 同一项目下添加多个 .cs文件

本文介绍了如何将C#游戏开发中的代码从单个.cs文件拆分到多个.cs文件中,以提升代码的可维护性和可读性。文章演示了在Visual Studio中创建Hero类和ShowInfo类的具体步骤:通过右键项目名添加新建类,将原有代码分别剪切到对应的类文件中,并自动生成命名空间。拆分后需要在Program.cs中通过"using"指令引用这些类,最后通过运行测试验证功能正常。这种模块化代码组织方式能有效解决单一文件代码过长、结构混乱的问题。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1137

hdu3068 . 最长回文

Problem Description给出一个只由小写英文字符 a,b,c...y,za,b,c...y,z 组成的字符串 S ,求 S 中最长回文串的长度. 回文就是正反读都是一样的字符串,如 aba,abbaaba, abba 等Input输入有多组 case ,不超过 120 组,每组输入为一行小写英文字符 a,b,c...y,za,b,c...y,z 组成的字符串 S 两组 case 之

Felix-Lee的博客 474

UNet改进(23):如何用SLCAM模块提升UNet的分割性能

本文提出一种改进的UNet架构,通过引入轻量化注意力模块(SLCAM)增强医学图像分割性能。SLCAM整合了通道和空间双重注意力机制:通道注意力采用全局池化和共享MLP学习通道权重,空间注意力通过7×7卷积捕捉上下文信息。网络在传统UNet基础上,在每个下采样和上采样块后加入SLCAM模块,并保持跳跃连接结构。实验表明,该方法能自适应聚焦重要特征,在不显著增加计算负担的情况下提升分割精度,特别适用于医学图像等需精确边界的场景。未来可探索三维注意力、动态参数调整等改进方向。

2501_91516851的博客 438

【报错解决】OpenClaw 报错 Unsupported engine: requires node >=22.0.0 —— Node.js 版本过低的完整排查与解决实录

在国产操作系统环境下部署OpenClaw时遇到"Unsupported engine: requires node >=22.0.0"报错,分析表明该工具要求Node.js 22+以支持fetch API等新特性。解决方案包括:1) 使用nvm升级Node至22+版本;2) Docker环境中改用node:22-alpine镜像;3) 不推荐强制忽略引擎检查。文章强调遵循引擎要求的重要性,指出环境版本是工程化体系稳定运行的关键,建议通过规范升级解决兼容性问题。(149字)

博客 608

kuangbin专题十六 KMP&&扩展KMP HDU3068 最长回文

kuangbin专题十六 KMP&amp;&amp;扩展KMP HDU3068 最长回文 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串...

ACMerszl的博客 285

从零实战:模拟Soul/陌陌附近的人接口爬虫(设备指纹·加密逆向·动态代理全解)

在移动互联网流量见顶的今天,LBS(基于位置的服务)社交平台——尤其是Soul和陌陌——依然掌握着海量高活用户的地理位置画像、兴趣标签、在线活跃时段等敏感数据。对于市场调研、流量运营、甚至是城市热力分析而言,“附近的人”接口是一个极具价值的入口。然而,这两款App均采用全参数加密 + 设备指纹风控 + WAF动态防御的三重护城河。直接使用Requests库调用公开API无异于以卵击石。本文将从逆向工程视角出发,完整还原一套可用的附近人信息采集方案,涵盖:抓包与流量分析(绕过SSL Pinning)

2201_76125261的博客 211

hdu 3068 最长回文 扩展KMP

最长回文 Time Limit: 4000/2000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1301Accepted Submission(s): 313 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求...

weixin_33929309的博客 145

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

hdu 3068 最长回文 (Manacher O(n) ) (扩展KMP和后缀数组也都可以做 O(nlogn))

/* Subject: Manacher Algorithm Author : a_clay Created Date : 2011-12-26 Sample : hdu 3068 */ #include #include #include #include #include #include #define Bug cout << "here\n";

so true_interview / 2073

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

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

HDU 3068 最长回文(manacher算法:回文字串)

HDU 3068 最长回文(扩展KMP:回文) http://acm.hdu.edu.cn/showproblem.php?pid=3068 题意:给你一个串,求这个串中的最长回文字串的长度. 分析:        利用扩展KMP算法可以很轻松的求出原始串的后缀回文字串长. 详解请见HDU3613解题报告: http://blog.youkuaiyun.com/u013480600/article

code 1804

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

专题十六 KMP & 扩展KMP & Manacher【Kuangbin】

kuangbin专题 HDU1711 Number Sequence【KMP】 HDU1686 Oulipo【KMP】 HDU2087 剪花布条【KMP】 HDU3746 Cyclic Nacklace【KMP】 HDU1358 Period【KMP】 HUST 1010 The Minimum Length POJ2406 Power Strings【KMP】 POJ275...

逐梦者 532

POJ 3974 HDU 3068 最长回文子串 Manacher 算法

今天看扩展KMP的时候无意看到这个算法的,这个算法能在线性时间内算出最长回文串的长度,真是强大啊,花了好长时间看懂原理,看懂网上的代码,顺便A了两道题 HAPPY   给几个好的链接http://blog.sina.com.cn/s/blog_70811e1a01014esn.html http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&

lentty1452的专栏 406

HDU 3068 最长回文串

题目大意:如题 思路:manacher算法,第一次没听懂..这次终于弄懂了..跟扩展KMP很像.... 先把在博客上看到的思想贴出来: 其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧。     首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多长,

muxi@Achilles的专栏 2522

poj3974 hdu3068最长回文子串 如果让我说:我只能说,实力决定一切

思路:简单题目,利用Manacher()方法,解决问题的方法和KMP类是,避免了冗余操作,可以提高效率 poj3974:   #include #include #include #include using namespace std; char pat[1000100*2]; char tem[1000100]; int sum[1000100*2]; int pox;

wahaha1_的专栏 579

HDU 3068最长回文串

//#include #include using namespace std; #define Max 110005 #define inf 10000000 //#define DUG_MEME 0 char a[Max];//主串 char b[Max];//模式串 int nextb[Max],nexta1[Max],nexta2[Max],ans; void kmp

LBO4031的专栏 1170

【Manacher算法】hdu3068 最长回文

留个回文串的版QAQ 这个算法。。和扩展KMP是一样的。。不过一个是顺着一个是回文。。。 int far = 0, ans = 0; for (int i = 1; s[i]; ++i) { int already = p[far] + far; p[i] = already > i ? min(already

每天心塞一点点 493

HDU 3068 最长回文

Manacher算法练笔,O(n)求最长回文子串。 参考资料:http://blog.youkuaiyun.com/ggggiqnypgjg/article/details/6645824 http://www.felix021.com/blog/read.php?2040 后缀数组和拓展KMP也可以求,不过时间复杂度都是O(nlogn)。 1 #include <cstd...

aegt43853的博客 69

最长回文 HDU - 3068 (KMP Manacher算法)

给出一个只由小写英文字符a,b,c…y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c…y,z组成的字符串S 两组case之间由空行隔开(该空行不用处理) 字符串长度len <= 110000 Output 每一行一个整数x,对应一组case,表示该组ca...

o f f i c的博客 705

hdu 3068(最长回文)

题意:容易理解... 思路:可以用扩展kmp来做,但是我还没怎么弄懂,时间复杂度O(n*logn),而manacher算法,第一次听说,代码比较短,不难理解,和扩展kmp有点类似,时间复杂度为:O(n),所以manacher算法更好吧!学习这个算法我推荐一个好的博客:http://blog.youkuaiyun.com/kg_second/article/details/8865210 代码实现: ...

weixin_30751947的博客 76
上一篇: 最长公共上升子序列(LCIS)的O(n^2)算法
下一篇: C/C++手动开大栈区
SprintfWater
博客等级 码龄15年 242粉丝 139原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值