news 2026/7/14 13:37:08

UVa 689 Napoleon‘s Grumble

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 689 Napoleon‘s Grumble

题目描述

给定一个文本行,找出其中所有长度至少为333的回文子串(忽略非字母字符,大小写不敏感),并按字典序输出,每个回文子串只输出一次。若一个回文子串完全包含在另一个较长的回文子串的中心位置(即两个回文中心相同且较短者完全位于较长者的中心),则较短者不应输出。例如,"AAAAAA"应输出"AAAAAA""AAAA"

本题需要高效找出所有回文子串。使用Manacher\texttt{Manacher}Manacher算法可在O(n)O(n)O(n)时间内找出所有回文中心及其最大半径。然后根据半径生成所有可能的回文子串,但需过滤掉“被更长的同中心回文完全包含”的回文。由于输出要求字典序,且每个回文子串只输出一次,可以用set<string>存储所有符合条件的回文子串,最后输出。

输入格式

多行文本,每行最多102410241024个字符,以EOF\texttt{EOF}EOF结束。

输出格式

对于每行输入,输出一行,包含所有符合条件的回文子串(大写,按字典序排列),用空格分隔。若没有,输出空行。

样例

输入

As the first man said to the first woman: "Madam, I'm Adam." She responded: "Eve."

输出

TOT MADAM MADAMIMADAM DED ERE EVE

题目分析

本题要求找出所有长度至少为 3 的回文子串,但需排除“被同中心更长的回文完全包含”的回文。Manacher\texttt{Manacher}Manacher算法可以求出每个中心的最大回文半径,然后从最大回文长度向下枚举所有长度,但只需保留那些“不能由同一中心更长的回文包含”的回文。实际上,对于每个中心,只需保留最大长度的回文,因为任何较短的回文都会被最长的回文包含。但如果有多个不同中心产生的回文长度相同且内容不同,则都保留。因此,我们可以对每个中心,只考虑最大半径对应的回文,然后检查该回文是否被其他中心产生的更长的回文包含(即完全位于另一个回文的中心位置)。题目要求若一个回文完全位于另一个回文的正中心,则忽略。

解题思路

  1. 预处理:去除非字母字符,转为大写,得到字符串s
  2. 使用Manacher\texttt{Manacher}Manacher算法计算每个中心(包括字符间空隙)的最大回文半径。
  3. 对每个中心,若最大半径对应的回文长度≥3\ge 33,则生成该回文子串。
  4. 使用set<string>存储所有候选回文(去重)。
  5. 最终输出时,对于每个候选回文,检查它是否被另一个长度更长的回文完全包含在中心位置,若是则跳过。
  6. 按字典序输出所有未被排除的回文。

Manacher\texttt{Manacher}Manacher算法实现时,在原字符串中插入分隔符(如#)以便统一处理奇偶长度回文。

复杂度分析

  • 预处理O(L)O(L)O(L)Manacher\texttt{Manacher}Manacher算法O(L)O(L)O(L),回文生成和去重O(L2)O(L^2)O(L2)(最坏),但L≤1024L \le 1024L1024,可行。

代码实现

// Napoleon's Grumble// UVa ID: 689// Verdict: Accepted// Submission Date: 2017-06-22// UVa Run Time: 0.000s//// 版权所有(C)2017,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;structpalindrome{intidx,length;booloperator<(constpalindrome&p)const{returnlength>p.length;}};boolcontains(set<string>&palindromes,string&block){if(palindromes.find(block)!=palindromes.end())returntrue;for(autop:palindromes){if(p.length()==block.length())continue;if((p.length()+block.length())%2==1)continue;boolincluded=true;intstart=(p.length()-block.length())/2;for(inti=0;i<block.length();i++)if(p[start+i]!=block[i]){included=false;break;}if(included)returntrue;}returnfalse;}voidmanacher(string&line){string word;word.push_back('#');for(inti=0;i<line.length();i++){word.push_back(line[i]);word.push_back('#');}vector<palindrome>P(word.size());for(inti=0;i<P.size();i++)P[i].idx=i;intcenter=0,rightmost=0,low=0,high=0;for(inti=1;i<word.length();i++){if(rightmost>i){intj=center*2-i;if(P[j].length<(rightmost-i)){P[i].length=P[j].length;low=-1;}else{P[i].length=rightmost-i;high=rightmost+1;low=i*2-high;}}else{P[i].length=0;low=i-1;high=i+1;}while(low>=0&&high<word.length()&&word[low]==word[high]){P[i].length++;low--;high++;}if((i+P[i].length)>rightmost){center=i;rightmost=i+P[i].length;}}sort(P.begin(),P.end());set<string>palindromes;for(inti=0;i<P.size();i++){if(P[i].length<=2)continue;string block;if(isalpha(word[P[i].idx]))block+=word[P[i].idx];for(intj=1;j<=P[i].length;j++)if(isalpha(word[P[i].idx+j])){block.insert(block.begin(),word[P[i].idx+j]);block.push_back(word[P[i].idx+j]);}if(contains(palindromes,block))continue;palindromes.insert(block);}boolfirst=true;for(autop:palindromes){if(first)first=false;elsecout<<' ';cout<<p;}cout<<'\n';}intmain(){cin.tie(0),cout.tie(0),ios::sync_with_stdio(false);string line;while(getline(cin,line)){if(line.length()==0)cout<<'\n';else{string cleared;for(inti=0;i<line.length();i++)if(isalpha(line[i]))cleared+=toupper(line[i]);manacher(cleared);}}return0;}

总结

本题通过Manacher\texttt{Manacher}Manacher算法高效找出所有回文中心及最大半径,再通过去重和中心包含关系过滤,最终输出所有符合条件的回文子串。关键点包括:

  • 使用Manacher\texttt{Manacher}Manacher算法处理回文查找。
  • 正确理解和实现“中心包含”过滤条件。
  • 输出时按字典序排列。

该解法是回文子串问题的进阶应用,适合作为字符串处理练习。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 13:36:51

iOS激活锁绕过解决方案:applera1n为您解锁iPhone 6s至X设备

iOS激活锁绕过解决方案&#xff1a;applera1n为您解锁iPhone 6s至X设备 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 如果您正在寻找一款能够解决iOS设备激活锁问题的实用工具&#xff0c;那么apple…

作者头像 李华
网站建设 2026/7/14 13:36:39

安卓双系统一键安装:DSU Sideloader终极实战指南

安卓双系统一键安装&#xff1a;DSU Sideloader终极实战指南 【免费下载链接】DSU-Sideloader A simple app made to help users easily install GSIs via DSUs Android feature. 项目地址: https://gitcode.com/gh_mirrors/ds/DSU-Sideloader 还在为传统刷机的高风险而…

作者头像 李华
网站建设 2026/7/14 13:35:39

Unity 2.5D游戏开发实战:用3D模型构建二维玩法

1. 项目概述&#xff1a;当3D模型遇见2D玩法如果你是一名Unity开发者&#xff0c;或者对独立游戏开发感兴趣&#xff0c;你可能经常在思考一个问题&#xff1a;如何让自己的游戏在视觉上脱颖而出&#xff1f;纯2D像素风固然经典&#xff0c;但有时显得过于“复古”&#xff1b;…

作者头像 李华
网站建设 2026/7/14 13:35:06

洛雪音乐音源配置终极指南:5步打造你的专属音乐库

洛雪音乐音源配置终极指南&#xff1a;5步打造你的专属音乐库 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 你是否曾打开洛雪音乐播放器&#xff0c;却发现搜索不到任何歌曲&#xff1f;作为一款…

作者头像 李华
网站建设 2026/7/14 13:35:05

G-Helper终极指南:如何用轻量化工具彻底掌控华硕笔记本性能

G-Helper终极指南&#xff1a;如何用轻量化工具彻底掌控华硕笔记本性能 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenboo…

作者头像 李华
网站建设 2026/7/14 13:34:30

Home Assistant前端:打造终极智能家居媒体控制中心

Home Assistant前端&#xff1a;打造终极智能家居媒体控制中心 【免费下载链接】frontend :lollipop: Frontend for Home Assistant 项目地址: https://gitcode.com/gh_mirrors/frontend149/frontend Home Assistant前端作为领先的智能家居平台的核心界面&#xff0c;为…

作者头像 李华