题目描述--->P1210 回文检测

分析:

看到回文显然想到了manacher算法(线性求解回文串问题

如果不了解还是去敲一下板子,学习一下比较好.-->manacher

题目要求我们求出只包含字母的回文串的长度.

如果你会manacher,这很简单.

只需要在输入之后处理一下我们得到的串即可.

这题的难点在于,如何输出原串


吐槽

本来以为求出我们的最长回文半径的最中间的位置的字符,判断其左右两侧遇到的第一个字符是否相等,如果相等我们就可以一直扩展过去,直至无法匹配.

感觉这种被卡的概率还是很低的...

兴冲冲地码了100多行.然而还是被卡了,绝望地很.


解决

首先明确:

s数组为我们的原字符数组.
str数组为我们只含有大写(小写)字母的字符数组
ss数组为我们用于跑manacher的字符数组

因此考虑去记录字符在原数组中的位置.

很容易将我们转化后的数组记录.
这样记录↓

for(RI i=0;i<l;i++)//l为我们原串长度,从l=0开始记录.{if((s[i]>='a' and s[i]<='z') or (s[i]>='A' and s[i]<='Z'))str[len]=s[i],pos[len]=i,len++;//我们只存储为字母的情况.}

处理我们得到的数组↓

for(RI i=0;i<len;i++){if(str[i]>='a' and str[i]<='z')str[i]-=32;}//在这里将小写转为大写.//也可以将大写转为小写//视个人爱好而定.

此时我们已经记录了某一位置对应的原串位置.

接下来就是我们的manacher操作了!

处理我们用于manacher的数组↓

for(RI i=0;i<len;i++)ss[2*i+1]=str[i];ll=2*len+1;//这里记得变换长度.
//这里我并没有进行插入字符的操作
//是因为我们的字符数组默认为空.
//这样的处理操作会使得中间空出一些位置.从而达到插入字符的效果.

我们现在需要考虑的是如何对我们用于manacher操作的数组进行标记操作,即对应原串位置.

因为我们用于manacher的数组ss[2*i+1]对应str[i],
所以我们的数组poss[2*i+1]也会对应pos[i].

所以我们的答案就很明显了.

最左端位置就是le=i-(RL[i]-1)+1
最右端位置就是ri=i+(RL[i]-1)-1
其中RL[i]-1代表以i为对称轴的回文子串长度

所以我们枚举poss[le]到poss[ri]输出答案即可.

--------------------代码--------------------

#include<bits/stdc++.h>
#define IL inline
#define RI register int
char s[200008],str[200008],ss[400008];
int l,len,pos[200008],RL[200008],ll,ans,le,ri,poss[200008];
int main()
{while(~(s[l]=getchar())){l++;}//输入还是看了其他人的 emmmm,自己写的一个炸了 emmmfor(RI i=0;i<l;i++){if((s[i]>='a' and s[i]<='z') or (s[i]>='A' and s[i]<='Z'))str[len]=s[i],pos[len]=i,len++;}for(RI i=0;i<len;i++){if(str[i]>='a' and str[i]<='z')str[i]-=32;}int MaxRight=0,center=0;RL[0]=1;for(RI i=0;i<len;i++)ss[2*i+1]=str[i],poss[2*i+1]=pos[i];//这里的对应操作.ll=2*len+1;for(RI i=1;i<ll;i++){if(i<=MaxRight)RL[i]=std::min(RL[2*center-i],MaxRight-i);else RL[i]=1;while(i-RL[i]>=0 and i+RL[i]<ll and ss[i+RL[i]]==ss[i-RL[i]])RL[i]++;if(i+RL[i]-1>MaxRight)MaxRight=i+RL[i]-1,center=i;if(RL[i]-1>ans){ans=RL[i]-1;le=i-RL[i]+2;ri=i+RL[i]-2;}}printf("%d\n",ans);for(RI i=poss[le];i<=poss[ri];i++)std::cout<<s[i];
}

转载于:https://www.cnblogs.com/-guz/p/9612862.html

Manacher【p1210】回文检测相关推荐

  1. HDU - 6599 I Love Palindrome String (回文树+Manacher、回文树+hash)

    题目链接 题意 一个长度为3e5的字符串,求长度为iii的字符串满足字符是回文串而且字符串的前一半也是回文串的个数 思路 回文数求出所有的回文字符串,然后用Manacher或者Hash判断是否符合条件 ...

  2. 2018 ICPC 南京 M. Mediocre String Problem(ExKMP + Manacher / ExKMP+回文树)

    2018 ICPC 南京 全文见:https://blog.csdn.net/qq_43461168/article/details/112796538 M. Mediocre String Prob ...

  3. 用数组存储字符C进行回文检测

    #include<bits/stdc++.h> using namespace std;int main() {char c[20];int i,j;cout<<"请 ...

  4. 自定义堆栈(回文检测)

    using System; using System.Collections;namespace CStack {class Program{static void Main(string[] arg ...

  5. 最长回文 HDU - 3068(求最长回文串的长度【马拉车算法Manacher】)

    马拉车算法 Manacher's Algorithm 是用来查找一个字符串的最长回文子串的线性方法,由一个叫 Manacher 的人在 1975 年发明的,这个方法的最大贡献是在于将时间复杂度提升到了 ...

  6. 【manacher】双倍回文(金牌导航 manacher-2/luogu 4287)

    双倍回文 金牌导航 manacher-2 luogu 4287 题目大意 设串为x,将其取反为x',定义双倍回文为形如xx'xx'的串 现在给你一个字符串,让你求最大双倍回文子串 输入样例 16 gg ...

  7. 7.Deque的应用案例-回文检查

    - 回文检测:设计程序,检测一个字符串是否为回文. - 回文:回文是一个字符串,读取首尾相同的字符,例如,radar toot madam. - 分析:该问题的解决方案将使用 deque 来存储字符串 ...

  8. 算法——回文(palindrome)

    回文(palindrome):指的是从头读到尾与从尾读到头一模一样的字符串. 分别在C.Java与Python实现回文检测: C: #include <stdio.h> #include ...

  9. python判断字符串是否回文_判断字符串是否为回文 python

    回文正序和逆序一样的字符串,例如abccba 方法一 def is_palindrome1(text): l = list(text) l.reverse() t1 = ''.join(l) if t ...

最新文章

  1. vue异步数据 报错_vue中异步请求数据,异步请求还没完成,文件就执行了就会报错,怎么解决?...
  2. 关于用批处理写ftp上传文件
  3. 服务器返回一个无效的JSON string,处理
  4. ImportError: No module named 'commands'
  5. 公共服务领域英文译写规范_公共领域日:对版权和公共领域重要性的思考
  6. Android之通过ContentResolver获取手机图片和视频的路径和生成缩略图和缩略图路径
  7. [react] react中什么是受控组件?
  8. 产品经理高质量产物的五步思维法
  9. 设计灵感|单色配色,如何让海报更出彩?
  10. 关于ng-cloak解决闪现问题的一点坑
  11. 生成和解析二维码(zxing)
  12. svn拉取文件失败_TortoiseSVN常见的错误信息与解决方法
  13. 织梦首页header实现会员的登录及会员状态显示
  14. facebook piexl 像素追踪
  15. html语言定义诗歌教学实例,小班语言活动案例分析:古诗清明
  16. java毕业设计——基于java+JSP+MySQL的健身俱乐部会员管理系统设计与实现(毕业论文+程序源码)——健身俱乐部会员管理系统
  17. 嘉兴 机器人仓库 菜鸟_揭秘菜鸟自动化仓库 机器人物联网+大数据(附视频)...
  18. web3开发课程精选
  19. @开发者:个推小程序消息推送解决方案来了
  20. TurnipBit—MicroPython开发板:妥妥拽拽零基础也能玩编程

热门文章

  1. 系统如何启动数据库服务器,怎么启动sql数据库服务器
  2. 判断ROS版本号-ubuntu20.04安装ROS_noetic-修改镜像源
  3. java调用scilab_Java调用Scilab-编译运行Javasci v2
  4. vi(vim)编辑器 学习笔记
  5. 算法训练 数的划分 动态规划
  6. HTML+CSS+JS实现 ❤️鼠标悬停性感美女图片特效❤️
  7. linux将mysql导出表数据导入另一台服务器_远程linux服务器mysql数据库导入和导出.sql文件...
  8. php 路径有汉字,路径文字工具
  9. PHP2002,php - 错误:SQLSTATE [HY000] [2002]没有这样的文件或目录 - SO中文参考 - www.soinside.com...
  10. mysql5.5客户端_MySQL 5.5/5.6——概述 MySQL 客户端程序