回文_Manacher算法

算法简介:算法的目的是在O(n)的时间复杂度内找到一个字符串中各个字母所在的最大长度的回文串。

此算法用到了一个Rad[]数组的定义,Rad[i]表示回文的半径,即最大的j满足str[i-j+1...i] = str[i+1...i+j]。

我们的工作就是把全部的Rad[]求出来。

有两个结论:

 (1): 对于一个整数k,如果 (1<=k<=Rad[i] && Rad[i-k] < Rad[i]-k ) 那么, Rad[i+k] = min( Rad[i-k], Rad[i]-k ).

(2) :  对于一个整数k,如果 (1<=k<=Rad[i] && Rad[i-k] > Rad[i]-k ) 那么, Rad[i+k] = min( Rad[i-k], Rad[i]-k ).

参考http://www.starvae.com/?p=212

模版:参考poj3974

View Code
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <string>
 5 using namespace std;
 6 //13400K 485MS 
 7 const int maxnum=2000005;
 8 int rad[maxnum];
 9 
10 int manacher(char *str)
11 {
12     memset(rad,0,sizeof(rad));
13     string s;
14     int n=strlen(str);
15     int ans=0;
16     int i,j,k;
17     for(i=0;i<n;i++)
18     {
19         s+='#';
20         s+=str[i];
21     }
22     s+='#';
23     n=(n<<1)+1;
24     i=0;
25     j=1;
26     while(i<n)
27     {
28         while(i-j>=0 && i+j<n && s[i-j]==s[i+j])
29             j++;
30         rad[i]=j-1;
31         k=1;
32         while(k<=rad[i] && rad[i]-k!=rad[i-k])
33         {
34             rad[i+k]=min(rad[i-k],rad[i]-k);
35             k++;
36         }
37         i+=k;
38         j=max(j-k,0);
39     }
40     for(i=0;i<n;i++)
41         ans=max(ans,rad[i]);
42     return ans;
43 }
44 
45 int main()
46 {
47     int num=1;
48     char str[maxnum];
49     while(scanf("%s",str)!=EOF)
50     {
51         if(strcmp(str,"END")==0)
52             break;
53         else
54         {
55             printf("Case %d: ",num++);
56             printf("%d\n",manacher(str));
57         }
58     }
59     return 0;
60 }

 

转载于:https://www.cnblogs.com/pushing-my-way/archive/2012/08/26/2657516.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 查当前pid_杀死僵尸进程,你需要这些神奇高效的Linux命令行

Linux 高手&#xff0c;其实都是玩儿命令行很熟练的人。命令行的学习捷径Linux 命令有许多强大的功能&#xff1a;从简单的磁盘操作、文件存取&#xff0c;到进行复杂的多媒体图像和流媒体文件的制作&#xff0c;都离不开命令行。在 Linux 的学习中&#xff0c;新手都会遇到这么…

3d000: no database selected_No.[C9]020

No.[C9]-020”Youre Not Alone&#xff0c;never alone。“别难过&#xff0c;别害怕&#xff0c;这个世界还有那么多爱你的人&#xff0c;和支持你的人&#xff0c;生活可能没有那么趁人心意&#xff0c;每个人都如此&#xff0c;别灰心&#xff0c;你并不孤单。(愿我的好朋友…

js实现树形结构化

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注小歌谣 日常分享前后端知识 前言 今天来讲一下平常我们做权限系统中的树形结构知识 就是如何把对应关系的结构数据转换为可以一个树形结构 const data [{id: 2,pid: 0,path: /course,name: Course,title: 课程管理},{id…

viewer.js实现预览效果

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注小歌谣 日常分享前后端知识 前言 最近涉及一个移动端项目 需要把其中的图片变成可预览的图片 听学弟说 可以利用viewer进行实现 首先 我们需要做的就是先写一个简单demo 先实现其中的效果 实现效果 代码 <!doct…

android 论坛_如何看待百度android吧萎靡现象与吧主的无所作为

百度android吧当初被誉为贴吧中的机锋论坛&#xff0c;现如今缺惨不忍睹&#xff0c;这一切究竟是百度资本家的阴谋还是吧主个人无所作为&#xff1f;然而就此事本人与android吧吧主展开讨论以及对其能力的质疑…这本来只是对android吧吧主随意加精普通的质问…然而该吧主却说我…

logisim优先编码器怎么用_变频电机为什么要用编码器?又该如何选型?

在自动化控制中经常会碰到各种电机的控制&#xff0c;在输送带、升降机、提升小车等较大功率的电机大部分是用变频电机&#xff0c;各个品牌PLC变频器驱动控制变频电机也很普及了。但是&#xff0c;用户经常会有这样那样的问题出现&#xff1a;变频电机为什么要装编码器?不装编…

修复计算机语言设置是哪个键,Windows语言设置后修复计算机的方法

当我们给我们的windows语音设置后&#xff0c;电脑可能会出现点问题&#xff0c;这个时候我们需要修复一下计算机&#xff0c;其中要进入BIOS的操作可能会难倒一部分新手用户&#xff0c;那么该如何操作呢&#xff1f;接下来我给大家整理了该如何一步步设置&#xff0c;一起来了…

笔记本电脑摄像头不能用_聊一款想代替笔记本电脑的产品

每次苹果发布iPad&#xff0c;部分自媒体KOL的言论总让我有一种自己必须转行的错觉&#xff0c;因为在他们眼中&#xff0c;笔记本电脑即将被iPad代替了&#xff0c;甚至还有人称iPad为“笔记本杀手”。谢谢&#xff0c;有被笑到。但一想到诺基亚当年就是这么傲慢地对待iPhone&…

EXCEL数据汇总-数据透视图

转载于:https://www.cnblogs.com/RogerLu/p/11194629.html

android menu菜单 实现点击后不消失_教你修改Windows万年不变的黄色文件夹,让文件也不枯燥...

Windows系统发展至今&#xff0c;文件夹的颜色和样式始终是没有太多的变化&#xff0c;一直是一成不变的shi黄色&#xff01;尽管我们可以通过右键>属性>自定义>来修改文件夹的图标&#xff0c;但这种方法不仅需要我们自己去找图标文件&#xff0c;如果文件夹多了&…

电源功耗压力测试软件,开关电源负载测试经验分享——这篇三分钟小文章着实令人“心动”...

开关电源&#xff0c;又称交换式电源、开关变换器&#xff0c;是一种高频化电能转换装置&#xff0c;是电源供应器的一种。开关电源利用的切换晶体管多半是在全开模式及全闭模式之间切换&#xff0c;这两个模式都有低耗散的特点&#xff0c;切换之间的转换会有较高的耗散&#…

ref是什么意思_终于有人说出A股不敢说的话:为什么股价不断下跌,大单却持续流入,你知道是什么缘由吗?...

(本文由公众号越声策略(yslc188)整理&#xff0c;仅供参考&#xff0c;不构成操作建议。如自行操作&#xff0c;注意仓位控制和风险自负。)炒股想成功牢记以下几点&#xff1a;第一、选股方法。字面意思很简单&#xff0c;但是也是个集大成的东西。你靠着均线能选股&#xff0c…

xp计算机关闭139端口,小编搞定xp系统电脑关闭139端口的图文方法

我们在使用xp系统的过程中,经常需要对xp系统电脑关闭139端口进行设置&#xff0c;可能很多用户都不知道怎么对xp系统电脑关闭139端口进行设置&#xff0c;但当我们遇到对xp系统电脑关闭139端口的设置方法非常简单&#xff0c;只需要点击“开始”&#xff0c;选择“运行”&#…

c++中计算2得n次方_《一元二次方程》单元试卷,从中总结出5个考点,初三学生应知道...

俗话说&#xff1a;“工欲善其事&#xff0c; 必先利其器。 ” 学好一元二次方程必须熟练掌握它的重要考点&#xff0c;再通过有针对性地做练习&#xff0c;提高解题能力。为了帮助大家切身感受一元二次方程这章的重要考点&#xff0c;下面将为大家详细解析一份单元模拟试卷&am…

maya计算机内存不足请保存,Maya内存不足不能渲染怎么优化场景?

Maya内存不足不能渲染怎么优化场景&#xff1f;可能由于Maya的场景文件过于复杂&#xff0c;或者材质质量过高的问题&#xff0c;用户最终渲染时会出现无法启用高质量的渲染工作的错误&#xff0c;这时候用户可以选择做一些合适的处理&#xff0c;以保证渲染工作的正常进行。Ma…

vc6开发一个抓包软件_惊奇软件[21]:这是一个程序员开发的背单词网站,可好用了!...

惊奇软件未经授权禁止转载正文---------------------------------哔哩哔哩小破站的UP主们就是厉害......就在前几天&#xff0c;小编我想找一款背单词的软件(某百词用的有点腻)&#xff0c;想到哔哩哩哩上的朋友们都比较年轻&#xff0c;喜欢学习&#xff0c;我就上哔哩哔哩搜索…

执行计划中的参数解释

执行计划中的各个参数解释&#xff1a; 一、Recursive calls &#xff08;递归调用&#xff09; 1、参考&#xff1a;Oracle Database Reference, 10g Release 2 (10.2).pdf第916页 Number of recursive calls generated at both the user and system level. Oracle maintains …

java jsonobject_Java实现QQ登录

准备工作1. 云服务器2. 备案的域名3. 本地调试需要修改hosts文件&#xff0c;将域名映射到127.0.0.1一、申请QQ互联&#xff0c;并成为开发者QQ互联&#xff1a;QQ互联官网首页登录后&#xff0c;点击头像&#xff0c;进入认证页面&#xff0c;填写信息&#xff0c;等待审核。审…

周至四中计算机老师,周至县第四中学顺利承办周至县 “教育信息化技术与教学课堂深度融合交流研讨会”...

原标题&#xff1a;周至县第四中学顺利承办周至县 “教育信息化技术与教学课堂深度融合交流研讨会”5月22日&#xff0c;周至县 “教育信息化技术与教学课堂深度融合交流研讨会”在我校举行&#xff0c;周至县教科局党委书记、局长张武祥、副局长尚雷、教研室书记杨正良、电教中…

bin文件怎么转换成文本文档_Python脚本4:根据txt文本,批量创建文件夹

背景&#xff1a;深度学习图像分类的时候&#xff0c;有许多的标签类。1000个标签就需要创建1000个文件夹&#xff0c;文件夹里面放入对应的图像。不可能一个一个右击创建文件夹&#xff0c;所以有了今天的脚本。根据txt文本每一行的类别&#xff0c;创建文件名为类别的文件夹。…