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,实在不行的话可以先过前两个,然后用第三个的代码试试看(笑)




【Ablation Studies 理解】深度学习模型组件的对比实验/性能分析 Ablation Study 用于检测深度学习/机器学习模型中各部分构件对于整体的重要性。 可以理解为为:组件\tricks重要性测试、组件性能系统性分析、控制变量法、组件去除对比实验、性能敏感性测试、性能因子分析等 Ablation Studies 一些新颖的深度学习模型在论文中都会进行AblationStudy,这部分的主要意义在于系统性的移除模型中的各种组件/trick等因子或者是创新的... 阅读详情

相关推荐

kaggle:Digit Recognizer《手写数字识别》你的第一个图像识别竞赛项目

新手,入门,巩固复习,深度学习,图像识别

qq_63591092的博客 3097

C++ 实现Manacher算法

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

KamikazePilot的博客 1123

RI-CLPM vs CLPM:什么时候该用随机截距交叉滞后模型?

本文深入对比了交叉滞后模型(CLPM)与随机截距交叉滞后模型(RI-CLPM)的核心差异与应用场景。RI-CLPM通过分离个体间稳定特质与个体内动态波动,能更纯净地估计变量间的动态因果关系,避免CLPM可能存在的混淆。文章提供了清晰的模型选择决策框架,并辅以Mplus语法示例,帮助研究者根据变量特质稳定性与研究问题,正确选用模型以确保结论的严谨性。

weixin_29276847的博客 303

Calf Flac-usaco

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

pzz837157806的专栏 1万+

ADS2023仿真变容二极管特性

仿真S-Param仿真控件,设置为Single Point,将频率设置为1MHz,同时勾选Z-parameters,取消S-parameters,从元件库中选择元器件搭建原理图,并根据器件spice提供的相关参数,对原理图中器件参数进行修改,修改完成的电路图如下图所示。添加var控件和MeasEqn控件,相关设置如图所示,Ct为变容管的电容值,Q0为其品质因数。因此,对变容二极管的模型仿真结果是可以信赖的。将其解压,在spice文件夹中,可以找到我们想要的器件参数,和仿真简要电路图。

weixin_45811090的博客 1万+

四旋翼无人机Matlab建模

本文主要分享一下四旋翼无人机的建模过程,然后在Matlab的simulink模块搭建起四旋翼无人机的模型,下一章将结合这个模型设计双环PID控制器并调节参数。 一、无人机建模过程

qq_36903625的博客 3万+

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

Java后端开发实战:手把手教你用e签宝API搞定电子合同签署(附完整代码)

本文详细解析了Java后端开发中如何通过e签宝API实现电子合同签署的全流程,包括环境配置、核心架构设计、Token管理、签署流程实现及回调处理等关键环节。通过完整的代码示例和最佳实践,帮助开发者高效集成电子签名服务,提升企业数字化转型效率。

weixin_42662293的博客 530

C++马拉车(Manacher)算法

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

ixRic 5885

【深度学习新浪潮】为什么OpenClaw这么吃token?

OpenClaw 高 Token 消耗的核心是 Agent 多轮思考、工具调用上下文累积,以及平台内置的模板/多模型协同开销;PD 分离在 OpenClaw 中可针对性解决长上下文 Prefill 阻塞、KV Cache 复用低效问题,是提升其推理效率的核心优化手段,主要落地在长上下文处理与生成阶段解耦、KV Cache 集中管理、动态资源调度三个方向。

专注:太空算力、AI infra、异构调度、大模型成本工程 419

完美解决unknown failed to transfer from http://0.0.0.0/ during a previous attempt的错误

完美解决unknown failed to transfer from http://0.0.0.0/ during a previous attempt的错误

念兮为美 2279

【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

LSTM+Transformer混合模型时间序列预测实战教学

LSTM+Transformer混合模型时间序列预测实战教学 毕业设计

8218

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

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

某司机的黑车 737

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

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

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

2301_79696886的博客 676

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

算法提升之字符串回文处理-(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、付费专栏及课程。

余额充值