回文_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;新手都会遇到这么…

某8位微型计算机地址码为18位,2015广东海洋大学计算机组成原理试题

一、选择题1、在定点运算器中&#xff0c;无论采用双符号位还是单符号位&#xff0c;必须有___溢出判断电路___ &#xff0c;它一般采用来____异或门__实现。2、同步控制是___由统一时序信号控制的方式___。3、在微型机系统中&#xff0c;外围设备通过__适配器____与主机的系统…

nodejs: mkdirs 递归创建目录

nodejs里面的所有文件操作我们很显然地都会选择异步方式。 nodejs对于文件的基本操作果然是很基本的。例如我们想创建一个二级目录&#xff1a;/abc/def&#xff0c;使用fs.mkdir必须先判断/abc&#xff0c;存在&#xff0c;才继续创建/abc/def。这样几个一层层的callback&…

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…

初中计算机课教什么时候,初中计算机教学课程教学方法探讨

黄其浩摘要&#xff1a;初中计算机课程的教学工作对于提升学生的综合素质有着十分重要的作用&#xff0c;本文深入分析了初中计算机教学中存在的问题&#xff0c;并且从两个角度提出了初中计算机教学中的解决问题的思路&#xff0c;为初中计算机课程教学工作提出了有效的管理方…

44. Wildcard Matching

description: 匹配字符串&#xff0c;具体看例子 Given an input string (s) and a pattern (p), implement wildcard pattern matching with support for ? and *. ? Matches any single character. * Matches any sequence of characters (including the empty sequence). …

Android makefile

示例 /** Android.mk文件必须从这一行定义开始&#xff0c;my-dir宏是build系统自带的函数&#xff0c;返回当前目录 */ LOCAL_PATH : $(call my-dir) /** CLEAR_VARS是build系统自带的变量&#xff0c;指示makefile脚本清除所有LOCAL_XXX变量&#xff0c;除了LOCAL_P…

viewer.js实现预览效果

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

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

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

计算机控制系统脉冲传递函数,第6.2课 (理解)计算机控制系统理论基础—脉冲传递函数.pdf...

第六章计算机控制系统理论基础计算机控制系统理论基础本章结构• 6.1 概述• 6.2 采样与采样定理• 6.3 信号的恢复与保持• 6.4 Z变换和Z反变换• 6.5 脉冲传递函数6.4 Z变换和Z反变换1 Z变换的由来• 在 《自动控制原理》中&#xff0c;线性连续系统的动态特性可以由微分方…

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

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

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

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

sql 内置函数

sql server自带的函数比较多&#xff0c;下面我把自己经常用到的总结一下: 1、getdate() 得到当前系统时间 2、datediff(差距单位&#xff0c;前时间&#xff0c;后时间)比较时间得到时间差 例&#xff1a;select datediff(day,2011-03-14,getdate()) 结果为1 注意&#xff1a;…

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

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

EXCEL数据汇总-数据透视图

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

乘法最快的算法计算机,人类史上最快乘法算法诞生

人类用四千年碰到乘法运算天花板&#xff1a;史上最快乘法算法诞生中科院物理所 2019-04-16 12:21:55图片&#xff1a;MENGXIN LI/QUANTA MAGAZINE四千年前&#xff0c;古巴比伦人最先发明了乘法。而历史上&#xff0c;数学家也在不断简化乘法的步骤&#xff0c;直到上个月&…

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

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

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

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

http抓包工具推荐WSockExpert/httpwatch/HttpAnalyzer/DebugBar

平常有事没事可以把玩下这几个抓包软件&#xff0c;蛮有意思&#xff01; 抓包分析源地址和目标url一般有下面几个软件&#xff1a;第一个是国产的WSockExpert。以前大家上网漏洞的时候很多时候都用到他。易上网&#xff0c;功能一般。但自身dll文件容易被认为木马删除。适用于…