马拉车用于解决最长回文子串问题,重点是子串,而不是子序列,时间复杂度为O(n)。

解释一下变量的意义:

Len[i]数组去存第i个位置到mx位置的长度

id记录上一次操作的位置(这个操作可以看模板)

mx标记上一次的最长子串的最右端

模板:

 1 void init()  //这个是用来处理字符串的
2 {
3 memset(str,0,sizeof(str));
4 int k=0;
5 str[k++]='$';
6 for(int i=0;i<len;++i)
7 str[k++]='#',str[k++]=s[i];
8 str[k++]='#';
9 len=k;
10 }
11 int manacher() //求最长回文子串
12 {
13 Len[0]=0;
14 int sum=0;
15 int id,mx=0;
16 for(int i=1;i<len;++i)
17 {
18 if(i<mx) Len[i]=min(mx-i,Len[2*id-i]);
19 else Len[i]=1;
20 while(str[i-Len[i]]==str[i+Len[i]]) Len[i]++;
21 if(Len[i]+i>mx)
22 {
23 mx=Len[i]+i;
24 id=i;
25 sum=max(sum,Len[i]);
26 }
27 }
28 return (sum-1);
29 }

当我们要求的以第i个字符为回文字符串的中心的时候,如果i>=mx这个时候没法优化,就是判断(i-1)==(i+1)、(i-2)==(i+2)....一直这样找

看代码就是进行19行、再进行20行

如果i<mx的时候,这个时候

这个时候看一道模板题:

Andy the smart computer science student was attending an algorithms class when the professor asked the students a simple question, "Can you propose an efficient algorithm to find the length of the largest palindrome in a string?"


A string is said to be a palindrome if it reads the same both forwards and backwards, for example "madam" is a palindrome while "acm" is not.



The students recognized that this is a classical problem but couldn't come up with a solution better than iterating over all substrings and checking whether they are palindrome or not, obviously this algorithm is not efficient at all, after a while Andy raised his hand and said "Okay, I've a better algorithm" and before he starts to explain his idea he stopped for a moment and then said "Well, I've an even better algorithm!".



If you think you know Andy's final solution then prove it! Given a string of at most 1000000 characters find and print the length of the largest palindrome inside this string.

Input

Your program will be tested on at most 30 test cases, each test case is given as a string of at most 1000000 lowercase characters on a line by itself. The input is terminated by a line that starts with the string "END" (quotes for clarity).

Output

For each test case in the input print the test case number and the length of the largest palindrome.

Sample Input

abcbabcbabcba
abacacbaaaab
END

Sample Output

Case 1: 13
Case 2: 6

这个时候要注意

不知道是这里memset(Len,0,sizeof(Len)); 导致的超时

还是

 1 void init()
2 {
3 memset(str,0,sizeof(str));
4 int k=0;
5 str[k++]='$';
6 for(int i=0;i<strlen(s);++i) 这个strlen导致的
7 str[k++]='#',str[k++]=s[i];
8 str[k++]='#';
9 len=k;
10 }

正确代码:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<set>
6 using namespace std;
7 const int maxn=3000005;
8 const int INF=0x3f3f3f3f;
9 const int mod=998244353;
10 char str[maxn],s[maxn];
11 int len,Len[maxn];
12 void init()
13 {
14 memset(str,0,sizeof(str));
15 int k=0;
16 str[k++]='$';
17 for(int i=0;i<len;++i)
18 str[k++]='#',str[k++]=s[i];
19 str[k++]='#';
20 len=k;
21 }
22 int manacher()
23 {
24 Len[0]=0;
25 int sum=0;
26 int id,mx=0;
27 for(int i=1;i<len;++i)
28 {
29 if(i<mx) Len[i]=min(mx-i,Len[2*id-i]);
30 else Len[i]=1;
31 while(str[i-Len[i]]==str[i+Len[i]]) Len[i]++;
32 if(Len[i]+i>mx)
33 {
34 mx=Len[i]+i;
35 id=i;
36 sum=max(sum,Len[i]);
37 }
38 }
39 return (sum-1);
40 }
41 int main()
42 {
43 int t=0;
44 while(~scanf("%s",s))
45 {
46 //memset(Len,0,sizeof(Len));
47 if(strcmp("END",s)==0) break;
48 len=strlen(s);
49 init();
50 printf("Case %d: %d\n",++t,manacher());
51 }
52 return 0;
53 }

Manacher算法 & Palindrome的更多相关文章

  1. Palindrome(poj3974)(manacher算法)

    http://poj.org/problem?id=3974 Palindrome Time Limit: 15000MSMemory Limit: 65536K Total Submissions: ...

  2. Palindrome(最长回文串manacher算法)O(n)

     Palindrome Time Limit:15000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  3. Codeforces Beta Round #7 D. Palindrome Degree manacher算法+dp

    题目链接: http://codeforces.com/problemset/problem/7/D D. Palindrome Degree time limit per test1 secondm ...

  4. 利用Manacher算法寻找字符串中的最长回文序列(palindrome)

    寻找字符串中的最长回文序列和所有回文序列(正向和反向一样的序列,如aba,abba等)算是挺早以前提出的算法问题了,最近再刷Leetcode算法题的时候遇到了一个(题目),所以就顺便写下. 如果用正反 ...

  5. POJ3974 Palindrome (manacher算法)

    题目大意就是说在给定的字符串里找出一个长度最大的回文子串. 才开始接触到manacher,不过这个算法的确很强大,这里转载了一篇有关manacher算法的讲解,可以去看看:地址 神器: #includ ...

  6. POJ 3974 Palindrome 字符串 Manacher算法

    http://poj.org/problem?id=3974 模板题,Manacher算法主要利用了已匹配回文串的对称性,对前面已匹配的回文串进行利用,使时间复杂度从O(n^2)变为O(n). htt ...

  7. 【Manacher算法】poj3974 Palindrome

    Manacher算法教程:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824 模板题,Code 附带注释: #include<cs ...

  8. hdu 3068 最长回文 manacher算法(视频)

    感悟: 首先我要Orz一下qsc,我在网上很难找到关于acm的教学视频,但偶然发现了这个,感觉做的很好,链接:戳戳戳 感觉这种花费自己时间去教别人的人真的很伟大. manacher算法把所有的回文都变 ...

  9. HDU3068 最长回文 Manacher算法

    Manacher算法是O(n)求最长回文子串的算法,其原理很多别的博客都有介绍,代码用的是clj模板里的,写的确实是异常的简洁,现在的我只能理解个大概,下面这个网址的介绍比较接近于这个模板,以后再好好 ...

随机推荐

  1. Flutter 基础组件:图片和Icon

    前言 Flutter中,可以通过Image组件来加载并显示图片,Image的数据源可以是asset.文件.内存以及网络. ImageProvider 是一个抽象类,主要定义了图片数据获取的接口load ...

  2. Maven学习笔记之第一个Maven项目(Linux)

    Maven是Apache旗下的管理Java项目jar包的项目管理工具,有了它可以很方便构建和管理我们的Java项目,你不必在互联网上逐个查找你需要的第三方jar包,你只需在maven reposito ...

  3. Python基础语法4-运算符

    Python提供了一系列丰富的运算符,包括:  Ø算术运算符  Ø赋值运算符  Ø关系运算符  Ø逻辑运算符 Ø位运算符  Ø三元运算符 Ø身份运算符 Ø成员运算符

  4. 通过JS逆向ProtoBuf 反反爬思路分享

    前言 本文意在记录,在爬虫过程中,我首次遇到Protobuf时的一系列问题和解决问题的思路. 文章编写遵循当时工作的思路,优点:非常详细,缺点:文字冗长,描述不准确 protobuf用在前后端传输,在 ...

  5. 【RAC】11gRAC 搭建(VMware+裸设备)

    安装环境与网络规划 安装环境 主机操作系统:windows 7虚拟机VMware12:两台Oracle Linux R6 U5 x86_64 Oracle Database software: Ora ...

  6. leetcode 473. 火柴拼正方形(DFS,回溯)

    题目链接 473. 火柴拼正方形 题意 给定一串数,判断这串数字能不能拼接成为正方形 思路 DFS,但是不能每次从从序列开始往下搜索,因为这样无法做到四个边覆盖不同位置的值,比如输入是(5,5,5,5 ...

  7. USB限流芯片,4.8A最大,过压关闭6V

    PW1503,PW1502是超低RDS(ON)开关,具有可编程的电流限制,以保护电源源于过电流和短路保护.它具有超温保护以及反向闭锁功能. PW1503,PW1502采用薄型(1毫米)5针薄型SOT2 ...

  8. 【Android初级】利用startActivityForResult返回数据到前一个Activity(附源码+解析)

    在Android里面,从一个Activity跳转到另一个Activity.再返回,前一个Activity默认是能够保存数据和状态的.但这次我想通过利用startActivityForResult达到相 ...

  9. 计算机网络安全 —— 非对称加密算法 RSA 和数字签名(二)

    一.非对称加密算法基本概念 在对称密钥系统中,两个参与者要共享同一个秘密密钥.但怎样才能做到这一点呢?一种是事先约定,另一种是用信使来传送.在高度自动化的大型计算机网络中,用信使来传送密钥显然是不合适 ...

  10. Mysql数据库下InnoDB数据引擎下的事务详解

    一.什么是数据库事务? 数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位.事务由事务开始与事务结束之 ...