Palindrome poj-3974

    题目大意:求字符串的最长回文子串。

    注释:$1\le strlen(s) \le 10^6$.

      想法:介绍一种字符串算法——Manacher。求以每一个字符和字符间隔为回文中心的回文半径长度。什么是Manacher?

        我们先来考虑这样一种暴力:如果我们用暴力来达到Manacher的效果,我们需要枚举每一个字符以及字符间隔,然后分别向左右扩展更新当前答案,时间复杂度$O(n^2)$,极限数据:连续的同样字符。那么,我们如何对其进行优化?

    

        我们显然不怎么会处理偶回文子串的方式,那么我们将每两个相邻字符之间加上'#',来达到只需要求出奇回文子串的效果(很巧妙)。

        紧接着,上面的图表示:

          id为已经处理过的字符串中回文子串最靠右的回文子串的回文中心。无论是字符还是'#'

          mx是id的回文子串右端点。

        更新... ...

int Manacher()
{
int maxLen=-1;
int mx=0;
int id=0;
for(int i=0;i<=n;i++)
{
if(i<mx)
p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
while(s_new[i-p[i]]==s_new[i+p[i]]) p[i]++;//s_new是带'#'的新字符串
if(mx<i+p[i])
{
id=i;
mx=i+p[i];
}
maxLen=max(maxLen,p[i]-1);
}
// for(int i=1;i<=n;i++)
// {
// cout << i << " " << s_new[i] << " " << p[i] << " " << endl;
// }
return maxLen;
}

      显然,是正确的,然后以'#'为回文中心的回文子串就是偶数,反之为奇数。p[i]表示以s_new中的i为回文中心的回文子串的回文半径。

    最后,附上丑陋的代码.. ....

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
int p[2000100];
char s[1000100];
char s_new[2000010];
int Manacher()//Manacher
{
int maxLen=-1;
int mx=0;
int id=0;
for(int i=0;i<=n;i++)
{
if(i<mx)
p[i]=min(p[2*id-i],mx-i);
else p[i]=1;
while(s_new[i-p[i]]==s_new[i+p[i]]) p[i]++;//s_new是带'#'的新字符串
if(mx<i+p[i])
{
id=i;
mx=i+p[i];
}
maxLen=max(maxLen,p[i]-1);
}
// for(int i=1;i<=n;i++)
// {
// cout << i << " " << s_new[i] << " " << p[i] << " " << endl;
// }
return maxLen;
}
void original()//初始化
{
memset(p,0,sizeof p);
n=0;
}
int main()
{
int count=0;
while(1)
{
original();
count++;
scanf("%s",s+1);
int k=strlen(s+1);
if(s[1]=='E') return 0;
printf("Case %d: ",count);
s_new[0]='$';//边界小技巧,不用特判
s_new[++n]='#';
for(int i=1;i<=k;i++)//建立新字符串
{
s_new[++n]=s[i];
s_new[++n]='#';
}
s_new[++n]='!';//+1
// for(int i=1;i<=k;i++) cout << s[i] ;
printf("%d\n",Manacher());
}
}

    小结:Manacher好东西qwq

[poj3974]Palindrome_Manacher的更多相关文章

  1. 马拉车算法——poj3974

    https://segmentfault.com/a/1190000008484167?tdsourcetag=s_pctim_aiomsg 讲的超好! manacher算法理解 回文串分为偶回文串和 ...

  2. POJ----(3974 )Palindrome [最长回文串]

    Time Limit: 15000MS   Memory Limit: 65536K Total Submissions: 5121   Accepted: 1834 Description Andy ...

  3. POJ3974 (manacher)

    var s,t:ansistring; n,op:longint; p:..] of longint; procedure pre; var i:longint; begin s:='$*'; to ...

  4. POJ3974 Palindrome (manacher算法)

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

  5. Palindrome(poj3974)(manacher算法)

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

  6. POJ3974 Palindrome

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  7. poj3974(manacher)

    传送门:Palindrome 题意:给定一个字符串,求最长回文子串. 分析:manach裸题,核心理解mx>i?p[i]=min(p[2*id-i],mx-i):1. #pragma comme ...

  8. Palindrome poj3974

    Palindrome Time Limit: 15000MS   Memory Limit: 65536K Total Submissions: 3280   Accepted: 1188 Descr ...

  9. POJ--3974 Palindrome(回文串,hash)

    链接:点击这里 #include<iostream> #include<algorithm> #include<stdio.h> #include<cstri ...

随机推荐

  1. mysql sql执行错误#1436 Thread stack overrun

    1.mysql调用存储过程  call proc1() 时报错:Thread stack overrun: 6656 bytes used of a 8496 byte stack, and 1280 ...

  2. PCB Winform中的WebBrowser扩展拖放(拖拽)功能 实现方法

    我们在Winform支持网页通常增加WebBrowser控件实现,相当于内嵌浏览器浏览网页使用, 而此WebBrowser默认情况是文件拖入功能是不支持的, 如何才能支持呢.在这里介绍如何实现方法 一 ...

  3. hash练习们

    610. 数对的个数 ★★   输入文件:dec.in   输出文件:dec.out   简单对比时间限制:1 s   内存限制:128 MB Description出题是一件痛苦的事情!题目看多了也 ...

  4. akka设计模式系列-Backend模式

    上一节我们介绍了Akka使用的基本模式,简单点来说就是,发消息给actor,处理结束后返回消息.但这种模式有个缺陷,就是一旦某个消息处理的比较慢,就会阻塞后面所有消息的处理.那么有没有方法规避这种阻塞 ...

  5. C# 多线程系列(六)

    同步 当多个线程共享一些数据的时候,我们就需要使用同步技术,确保一次只有一个线程访问合改变共享状态.注意,同步问题与争用和死锁有关. 例: ; static void Add() { ; i < ...

  6. Android仿今日头条和知乎等App顶部滑动导航实现代码分析及源码下载

    一.本文所涉及到的知识点 源码下载 二.目标 通过利用ViewPager+FragmentStatePagerAdapter+TabLayout 实现顶部滑动效果,如图: 三.知识点讲解 1.View ...

  7. [转]Linux下/proc目录简介

    1. /proc目录Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文 ...

  8. [Windows Server 2012] 杰奇CMS安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:JIEQI ...

  9. Python语言之控制流(if...elif...else,while,for,break,continue)

    1.if...elif...else... number = 23 guess = int(input('Enter an integer : ')) if guess == number: prin ...

  10. JS监听事件错误:Uncaught TypeError: xx(函数名)is not a function at HTMLInputElement.onclick

    事件监听一直出错,提示已定义的函数名不是一个函数,折腾了好久才想到,原来是函数名和JS内部关键字重名造成的. 以前也遇到过这种情况,但因为发生的概率比较小,就没太在意,但是这次感觉这方面确实需要注意, ...