USACO 6.2.1 Calf Flac 马拉车算法(Manacher's Algorithm)

P4391 [BOI2009] Radio Transmission 无线传输 据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘 ), 那么母牛们会制造出世上最棒的回文。你的工作就是去寻找这些牛制造的奇观(最棒的回文)。在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出), 只用考虑字母A∼Z和a∼z。要你寻找的最长的回文的文章是一个不超过20000个字符的字符串。我们将保证最长的回文不会超过2000个字符(在除去标点符号、空格之前)。 阅读详情

http://train.usaco.org/usacoprob2?a=Hfv8bxVT1Ac&S=calfflac

题目大意:一串字符串(不超过200000个字符),求最长回文子串(不考虑非字母字符),并输出这一段(要包含非字母字符,包括换行符)


裸的最大回文子串题,直接用马拉车算法可解:

※马拉车算法讲解可参考:https://www.cnblogs.com/grandyang/p/4475985.html

    但是这篇博客里有些小问题:

        ①变量id指的应该是最右成匹边界对应的字符串中心,而不是最长回文子串的中心

        ②匹配半径P[]时而包含中心(初始为1),时而不包含中心(mx-i),自己写的时候需要统一一下

    

至于非字母字符的问题,最简单粗暴的方法就是直接先把原始字符串过一遍记录下除字符后位置与原始位置的对应关系,顺便把大写字母转变成对应的小写字母

/*
ID: frontie1
TASK: calfflac
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

string origin;
char tem[82];
int pos[200000];
int e = 0;
char arr[400010];
int P[400010];

bool ischaracter(char chr)
{
    if((chr >= 'a' && chr <= 'z') || (chr >= 'A' && chr <= 'Z')) return true;
    return false;
}

int Manacher()
{
    int length = 2*e+1;
    int id = 0, mx = 0;
    int outlen = 0, output = 0;
    for(int i = 1; i <= length; ++i){
        P[i] = (mx > i) ? min(mx-i, P[2*id-i]) : 0;
        while(arr[i+P[i]+1] == arr[i-P[i]-1]) ++P[i];
        if(i+P[i] > mx){
            mx = i+P[i];
            id = i;
        }
        if(P[i] > outlen){
            output = i;
            outlen = P[i];
        }
    }
    return output;
}

int main()
{
    freopen("calfflac.in", "r", stdin);
    freopen("calfflac.out", "w", stdout);

    while(cin.getline(tem, 82, '\n') && !cin.eof()){
        origin += tem;
        origin += "\n";
    }

    arr[0] = '$'; arr[1] = '#';

    for(int i = 0; i < origin.length(); ++i){
        if(ischaracter(origin[i])){
            pos[e] = i;
            arr[2*e+2] = (origin[i] <= 'Z' ? 'a'+origin[i]-'A' : origin[i]);
            arr[2*e+3] = '#';
            ++e;
        }
    }
//
//    for(int i = 0; i < e; ++i){
//        cout << pos[i] << ' ';
//        if(i % 80 == 0) cout << endl;
//    }

    arr[2*e+2] = '$';

    int centre = Manacher();

    int st = (centre-P[centre]-1)/2;
    int ed = (centre+P[centre]-3)/2;

    //cout << origin << endl;

    cout << P[centre] << endl;
    for(int i = pos[st]; i <= pos[ed]; ++i){
        cout << origin[i];
    }
    cout << endl;

    return 0;
}

附录:这题在USACO上的测试样例也是很走心hhh,实在不行的话可以先过前两个,然后用第三个的代码试试看(笑)




[RK3588从入门到精通] 专栏目录及介绍 阅读详情

相关推荐

RNA 8. SCI文章中差异基因表达--热图 (heatmap) 进阶:从数据标准化到多维度注释

本文深入探讨了RNA差异基因表达分析中热图(heatmap)的进阶应用,从数据标准化到多维度注释。详细介绍了FPKM标准化、Z-score转换等关键技术,以及pheatmap包的高级注释功能,帮助研究者制作发表级热图。文章还提供了视觉优化策略和生物学意义衔接的实用建议,助力SCI论文的数据可视化。

weixin_29051149的博客 302

C++ 实现Manacher算法

这里我们采取从中间向两边扩散的方式,动态查找可能存在的最大回文串。 例如以下标位置的为中心的最长回文子串为 以下标位置的为中心的最长回文子串为 以下标位置的为中心的最长回文子串为 但是这种求解过程有一定局限性,它无法判断长度为偶数的回文串所以如果我们需要同时判断偶数个的子串,就需要从两个值之间的位置出发判断这里的选择,是通过直接添加补间字符的方式来解决这个问题。 例如: 这样的话我们就可以判断偶数串的回文情况。 至于为何前后各额外添加了一个,则是为了后面方便计算使用。重构字符串代码: 2.暴力解法

KamikazePilot的博客 1123

实战演练:用wvp-GB28181-pro + ZLMediaKit搭建一个可用的国标视频监控测试环境(附设备模拟器对接)

本文详细介绍了如何使用wvp-GB28181-pro和ZLMediaKit在Ubuntu系统上搭建GB28181视频监控测试环境。从环境准备、组件解析到核心服务部署与设备模拟器对接,提供完整的实战指南,帮助开发者快速构建可验证的监控系统。

weixin_42692935的博客 579

Calf Flac-usaco

1.求最长回文串,而且要求记录位置。yikau

pzz837157806的专栏 1万+

图像去雨:超详细手把手写 pytorch 实现代码(带注释)

占个坑,过几天来写

书山有路,学海无涯! 1万+

物理与工程中的‘黑话’:Kronecker delta和Levi-Civita符号到底简化了什么?

本文深入解析了物理与工程中常用的Kronecker delta和Levi-Civita符号的简化作用。通过对比传统表示与张量表示,展示了这些符号在向量运算、矩阵迹计算及流体力学模拟中的高效应用,显著提升计算效率和代码可读性。特别适合理论物理和工程数学领域的学习者与从业者。

weixin_27215403的博客 397

Manacher算法C++实现

manacher算法也称“马拉车算法”,是用来解决求字符串的最长回文串的算法。 对于求最长回文串有三种算法: 1.暴力枚举法 优点:简单易写 缺点:复杂度过高(o(n^3)) string s; cin >> s; int maxlength =1,start=0; for (int i = 0; i < s.size(); i++) { for (int j = i + 1; j < s.size(); j++) { int temp1..

GaoXiaoYuan0728的博客 1163

手机直连低轨卫星通信:架构、关键技术和未来展望

【摘 要】借助低轨卫星星座全时全域覆盖优势,手机直连卫星通信预期成为6G重要特征之一。首先介绍了手机直连卫星的测试验证、标准化与商业项目发展现状。其次,介绍了基于透明转发、部分可再生处理、完全可再生处理、集成接入和回传的四种手机直连低轨卫星网络架构及组网方式。通过分析手机直连低轨卫星网络场景下高移动性与大传输时延等带来的接入与传输问题,提出对地面移动通信体制进行适应性改进的关键技术方案。最后,探讨了未来手机直连低轨卫星发展发向和潜在思路。通过上述阐述与分析,提供未来发展手机直连低轨卫星通信的可行路径。【关

fzq0625的博客 1707

C++马拉车(Manacher)算法

文章目录功能马拉车算法初始化 功能 马拉车算法(Manacher’s Algorithm):用O(n)O(n)O(n)的时间得到一个字符串中,以每个字符为中心的最长回文的长度。 马拉车算法 初始化 ...

ixRic 5885

玩转企业微信群机器人:一份超详细的Webhook消息推送指南

企业微信群机器人是一个连接内部协作与外部服务的强大桥梁。通过灵活运用本文介绍的各种消息类型,你可以构建出丰富多彩、信息明确的自动化通知系统,极大地提升团队沟通效率。现在,就动手试试,将你的第一个机器人集成到工作流中吧!如果你有任何有趣的机器人应用场景或遇到了问题,欢迎在评论区留言交流!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3975

开源推荐:5个最实用的AIGC风格迁移项目

随着人工智能技术的飞速发展,AIGC(人工智能生成内容)领域取得了显著的成果。风格迁移作为AIGC中的一个重要分支,旨在将一种图像的风格应用到另一种图像上,创造出具有独特艺术效果的新图像。本文的目的是为读者推荐5个最实用的AIGC风格迁移开源项目,详细介绍这些项目的技术原理、使用方法和应用场景,帮助读者在实际项目中选择合适的工具进行风格迁移。文章的范围涵盖了这些项目的核心概念、算法原理、数学模型、项目实战以及相关的学习资源和未来发展趋势等方面。

AI 原生应用开发的博客 1704

【USACO题库】1.3.3 Calf Flac

【USACO题库】1.3.3 Calf Flac 题目大意: 找出最长的回文。在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母’A’-‘Z’和’a’-‘z’。要寻找的最长的回文的文章是一个不超过20,000个字符的字符串。保证最长的回文不会超过2,000个字符(在除去标点符号、空格之前)。 解题思路: 在输入时将有效字符(‘A’–‘Z’,‘a’–‘z’)放入b数组(注意都改成大写或小写)。在每个位置存入满足当前位置向左和向右i位都相同的i的最大值。最后再按最大值所在的位

Don't Carry 464

【智能车Code review】——小S与中S道路判断

基本思想: 找到中线的左拐点和右拐点,并且计算出两点之间的空间距离。通过限制空间距离,分为中S和小S。 注意这种情况:当20行以下的中线斜率比较陡,此时可以通过人为限制设定,将第0行的中线设置为拐点。 if (flag_centre_right_point == 0 && flag_centre_left_point == 1 && parameterB >= 0.5 && centre_left_point[0] >= 33) { .

hanhan的博客 6104

Manacher's Algorithm ----马拉车算法(【USACO题库】1.3.3 Calf Flac)

题目描述 中心搜索法 Manachers Algorithm 正题 大概流程 code题目描述据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。 你的工作就是去这些牛制造的奇观(最棒的回文)。 在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母’A’-‘Z’和’a’-‘z’。 要你寻找的最长的回文的文章是一个不

某司机的黑车 737

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

[USACO 1.3] 最长的回文 Calf Flac(c++)

在寻找回文时不用理睬那些标点符号、空格(但应该保留下来以便做为答案输出),只用考虑字母'A'-'Z'和'a'-'z'。要你寻找的最长的回文的文章是一个不超过20,000个字符的字符串。据说如果你给无限只母牛和无限台巨型便携式电脑(有非常大的键盘),那么母牛们会制造出世上最棒的回文。你的工作就是去寻找这些牛制造的奇观(最棒的回文)。下一行或几行应该包括这个回文的原文(没有除去标点符号、空格),把这个回文输出到一行或多行(如果回文中包括换行符)。输出的第一行应该包括找到的最长的回文的长度。

2301_79696886的博客 676

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

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

USACO 1.3-Calf Flac

<br />题目在这里<br />这道题折腾了我好几天!<br />先用搜索写了一个代码,结果搜索写sd了,竟然TLE!<br />只好改写DP。<br />方程:<br />f[i]:=f[i-1]+2(a[i]=a[i-f[i-1]-1] )<br />f[i]:=2(a[i]=a[i-1]) <br />f[i]:=1(else)<br />代码在此:<br />{ ID:asdcyt01 PROB:calfflac LANG:PASCAL } var n,i,len,max,maxi

inspoy的专栏 417

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

算法提升之字符串回文处理-(manacher)

今天给大家分享的就是关于manacher算法的解题方法与思路。

2301_81754159的博客 1287

Manacher (马拉车算法)

Manacher (马拉车算法) 的介绍 中心扩展算法 —— 优化 —— 马拉车 P3805 模板manacher 算法 P1659 [国家集训队]拉拉队排练 P4555 [国家集训队]最长双回文串

日常记录,挨打要立正! 2万+

Manacher算法(马拉车算法)

Manacher算法,又叫“马拉车”算法,可以在时间复杂度为O(n)的情况下求解一个字符串的最长回文子串长度的问题。

诸君拔剑吧. 4280

Calf Flac(枚举)

  Calf Flac It is said that if you give an infinite number of cows an infinite number of heavy-duty laptops (with very large keys), that they will ultimately produce all the world's great palindro...

Simone chou... 226

马拉车(Manacher)算法

马拉车算法与KMP算法都是解决字符串问题的经典算法,为什么把它们俩个放在一起呢?这是因为它们的思想都是用前面已知的信息去更新后面的信息。

qq_42376883的博客 1570

[USACO] Calf Flac

最初的想法:让i指向字符串的首端,j指向末端,然后对每一个i,j逐渐递减,然后对每一个递减的j,判断i到j这段字符串是否回文。这个白痴的想法最坏需要O(n3)的时间,虽然可以通过局部的优化,提前结束i,j的遍历以及回文的判断,可是对于第八个测试数据死活也过不了,时间超了不止一点两点,本机上跑用了4秒多,我擦嘞!

天下的技术专栏 618

【算法】——Manacher Algorithm(马拉车算法)

一、马拉车算法来源 马拉车算法Manacher‘s Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这是非常了不起的。对于回文串想必大家都不陌生,就是正读反读都一样的字符串,比如 "bob", "level", "noon" 等等,那么如何在一个字符串中找出最长回文子...

汤庆 8404

马拉车算法(Manacher's Algorithm)

背景介绍: 给出一个字符串,求最长的回文字串,如果暴力的话,就是遍历所有点,以其当作中心像两边拓展寻找。这样的话,时间复杂度为O(n2);如果字符串长度很大的话,暴力的时间就有点长。这个时候Manacher 算法应运而生,也就是Manacher‘s Algorith,俗称为马拉车算法。它的时间复杂度为O(n)。虽然作用比较单一,但还是掌握的为好。 算法过程: 一,插入#字符 为了能够将字符串统一起...

qq_43227036的博客 3835

【字符串】马拉车(Manacher)算法

因为字符串长度的奇偶性,回文子串的中心可能是一个字符,也可能是两个字符中间的位置,所以为了解决这个问题,我们在每两个字符之间加一个。已经计算过了,如果以 j 为中心的回文子串在以 c 为中心的回文子串中时,我们可以直接把。,我们可以去找 i 关于 c 的对称点(记为 j),因为我们是从左往右计算的,所以。对于以每一个位置为中心点的时候单独计算,复杂度很大,马拉车可以对其进行很好地优化。此时已经有比以 c 为中心的回文子串更靠右的回文子串了,就把。马拉车算法可以求出一个字符串中的最长回文子串,时间复杂度。

Texcavator的博客 1065

“马拉车”Manacher算法,十分通俗,解释详细

马拉车manacher算法通俗解释,附带多种例子

m0_51386887的博客 920
上一篇: USACO 6.1.3 Cow XOR 字典树
下一篇: USACO 6.2.2 Packing Rectangles 暴力模拟
Frontier_Setter
博客等级 码龄10年 2粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值