题目描述--->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[2i+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,自己写的一个炸了 emmm
for(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];
}

Manacher【p1210】回文检测的更多相关文章

  1. 【SPOJ】NUMOFPAL - Number of Palindromes(Manacher,回文树)

    [SPOJ]NUMOFPAL - Number of Palindromes(Manacher,回文树) 题面 洛谷 求一个串中包含几个回文串 题解 Manacher傻逼题 只是用回文树写写而已.. ...

  2. C#进行回文检测,判断字符串是否是回文的代码

    下面代码内容是关于C#进行回文检测,判断字符串是否是回文的代码,应该是对各位朋友有些好处. Console.WriteLine("算法1:请输入一个字符串!");string st ...

  3. Manacher以及回文树算法学习

    Manacher以及回文树算法学习 一.Manacher 关于\(Manacher\),这篇博客 讲的很清楚. 大致总结一下 为了将长度为奇数的回文串和长度为偶数的回文串一起考虑,需要在原字符串中插入 ...

  4. java_回文检测

    package bao; import java.util.Scanner; public class Work { public static boolean digui(String str1,i ...

  5. 「Luogu P1210」回文检测 解题报告

    题面 这是一道诡异的黄题 居然让你求一串吧啦吧啦的东西中 字母(大小写)最长的回文串的长度,还要输出完整的串 吐血 思路: 保持淡定,我们啥都不会,就会Manacher,那就用Manacher大法! ...

  6. HDU 5371 Hotaru's problem (Manacher,回文串)

    题意:给一个序列,找出1个连续子序列,将其平分成前,中,后等长的3段子序列,要求[前]和[中]是回文,[中]和[后]是回文.求3段最长为多少?由于平分的关系,所以答案应该是3的倍数. 思路:先Mana ...

  7. Girls' research - HDU 3294 (Manacher处理回文串)

    题目大意:给以一个字符串,求出来这个字符串的最长回文串,不过这个字符串不是原串,而是转换过的,转换的原则就是先给一个字符 例如 'b' 意思就是字符把字符b转换成字符 a,那么c->b, d-& ...

  8. luogu1210 回文检测

    Manacher 正确读法:抹内A撤(马拉车) (跟着假硕学英语) 我们把原来的字符串,通过玄学处理,变成只留下字母,且每两个字母之间有一个奇怪的字符的那种Manacher专用字符串. 建立双射关系f ...

  9. HDU 5371——Hotaru's problem——————【manacher处理回文】

    Hotaru's problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

随机推荐

  1. UDP收/发广播包原理及步骤

    原文链接地址:http://www.2cto.com/net/201311/254834.html UDP收/发广播包原理及步骤 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要 ...

  2. 在iis上部署ssl证书 https

    1.取走证书下载下来的文件.解压iis的压缩包. 2.打开internet信息服务iis管理器 3.双击打开后,选择导入,导入我们刚刚解压得到的pfx文件,这个pfx文件就是你需要部署域名的那个文件. ...

  3. 【BZOJ 1407】[Noi2002]Savage ExGCD

    我bitset+二分未遂后就来用ExGCD了,然而这道题的时间复杂度还真是玄学...... 我们枚举m然后对每一对用ExGCD判解,我们只要满足在最小的一方死亡之前无解就可以了,对于怎么用,就是ax+ ...

  4. 如何使用Photoshop制作真实的尺子

    前言: 日常生活中经常性的偶尔需要测量一些东西的尺寸,但刚好手头上缺乏尺子等必要的测量工具,这时候其实我们可以利用Photoshop,临时制作一把基于现实物理单位(如:厘米)的虚拟尺子. 难点: 像素 ...

  5. 在Eclipse上使用egit插件通过ssh协议方式上传项目代码的具体步骤

    在Eclipse上使用egit插件通过ssh协议方式上传项目代码 前戏: 使用ssh方式可以不通过https协议,避免直接提供账号密码的方式上传项目到git在线服务器,如Bitbucket.GitHu ...

  6. oralce的客户端sqlplus

    安装完oracle后,默认的客户端是sqlplus,还有一个公司常用的是PLSQLdeveloper 客户端软件,另外Navicat primie这个可以连接mysql.sqlserver.oracl ...

  7. Linux重定向: > 和 &> 区别

    总结:>只能将正常信息重定向 &>可以将错误信息或者普通信息都重定向输出(下面是实测) [root@Dev_yang shellScript]# lll -bash: lll: c ...

  8. bzoj 3513 [MUTC2013]idiots FFT 生成函数

    [MUTC2013]idiots Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 806  Solved: 265[Submit][Status][Di ...

  9. Ubuntu下kafka集群环境搭建及测试

    kafka介绍: Kafka[1是一种高吞吐量[2]  的分布式发布订阅消息系统,有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能 ...

  10. python实现多个文件的分发

    之前写的脚本只能分发一个配置,每次分发多个配置总要执行很多次,很不爽,于是就有了这个脚本 from multiprocessing import Process import paramiko imp ...