算法的核心就在这一句上了:p[i] = min(p[2*id-i], p[id] + id - i);
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip> using namespace std;
const int N=; /*int len;            //原串长
char str[N];        //接收原来的串
char s[N*2];        //做了插入处理的结果串
int P[N*2];         //保存关于长度的信息(回文长度的一半再加1)
int cal()
{
    int id=1, mx=1, max1=1;
    P[0]=1;
    P[1]=1;
    for(int i=2; s[i]!='\0'; i++)        //考虑以i为中心的回文串
    {
        P[i] =i>mx? 1: min( P[2*id-i],mx-i);
        while(s[i+P[i]]==s[i-P[i]])     //在这比对
            P[i]++;
        if(i+P[i]>mx)       //更新id和mx的位置
        {
            id=i;
            mx=i+P[i];
        }
        if(P[i]-1>max1)     //更新最大值
            max1=P[i]-1;
    }
    return max1;
} int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        scanf("%s",str);
        len=strlen(str);
        memset(s,0,sizeof(s));
        memset(P,0,sizeof(P));
        
        //插入符号#
        s[0]='$';
        s[1]='#';
        int i=0, j=2;
        for(; i<len; i++)
        {
            s[j++]=str[i];
            s[j++]='#';
        }
        cout<<cal()<<endl;
    }
    return 0;
}
*/ int Manacher(string &str, int len)
{
    //插上辅助字符#
    string tmp(len*+,'#');
    tmp[]='$';
    for(int i=; i<str.size(); i++)    tmp[i*+]=str[i];
    
    int ans=;
    int mx=, id=;
    vector<int> P(*len+,);
    
    for(int i=; i<tmp.size(); i++)
    {
        P[i]=( i>=mx? : min( P[*id-i], mx-i ));
        while( tmp[i-P[i]]==tmp[i+P[i]] )    P[i]++;    //匹配了就继续扩大P[i]
        
        if(mx<=i+P[i])//重要:更新位置
        {
            mx=i+P[i];
            id=i;
        }
        ans=max(ans, P[i]-); //这就是长度了,不信动手画。
    }
    return ans;
} int main()
{
    int t;
    string str;
    cin>>t;
    while(t--)
    {
        cin>>str;
        cout<<Manacher(str, str.size())<<endl;;
    }
    return ;
}

统计最长回文串(传说中的Manacher算法)Hihocoder 1032的更多相关文章

  1. 1089 最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaaa ...

  2. 51Nod 1089:最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法)  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 回文串是指aba.abba.cccbccc.aaa ...

  3. 51NOD 1088 最长回文子串&1089 最长回文子串 V2(Manacher算法)

    回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串. 输入一个字符串Str,输出Str里最长回文子串的长度. Input 输入Str(Str的长度 <= 1000(第二题要 ...

  4. [51Nod1089] 最长回文子串 V2(Manacher算法)

    1089 最长回文子串 V2(Manacher算法) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   回文串是指aba.abba.cccbccc.aaaa这种左右对称 ...

  5. hdu5371 最长回文子串变形(Manacher算法)

    pid=5371">http://acm.hdu.edu.cn/showproblem.php? pid=5371 Problem Description Hotaru Ichijou ...

  6. 最长回文子串问题-Manacher算法

    转:http://blog.csdn.net/dyx404514/article/details/42061017 Manacher算法 算法总结第三弹 manacher算法,前面讲了两个字符串相算法 ...

  7. hdu3068 求一个字符串中最长回文字符串的长度 Manacher算法

    最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. 最长回文子串--轻松理解Manacher算法

    最长回文子串这个问题的Manacher算法,看了很多博客,好不容易理解了,做一下记录. 这个算法的核心就是:将已经查询过的子字符串的最右端下标保存下来,在计算下标为i的回文字符串时,不需要从左右相邻的 ...

  9. 【2018.07.28】(字符串/回文串)学习Manacher算法小记

    主要是应用在回文串啦,原理也理解了老半天,如果没有图片的话,我也看不太懂它的原理 学习的灵感来源来自于:https://segmentfault.com/a/1190000008484167 /* 最 ...

随机推荐

  1. UIView封装动画--iOS利用系统提供方法来做转场动画

    UIView封装动画--iOS利用系统提供方法来做转场动画 UIViewAnimationOptions option; if (isNext) { option=UIViewAnimationOpt ...

  2. html5--3.8 input元素(7)

    html5--3.8 input元素(7) 学习要点 input元素及其属性 input元素 用来设置表单中的内容项,比如输入内容的文本框,按钮等 不仅可以布置在表单中,也可以在表单之外的元素使用 i ...

  3. DDD领域驱动之干货 (一)

    说道DDD不得不说传统的架构与DDD的架构区别. 传统的架构不外乎就是三层,而在这三层里面又不断的细分,始终没有达到想要的效果,那么为什么当时还是采用三层. 当然在DDD没有提出的时候三层是大多数人的 ...

  4. CTSC2012 熟悉的文章

    传送门 首先很容易想到对于所有的模式串建出广义后缀自动机,之后对于我们每一个要检查的文本串,先在SAM上跑,计算出来每一个位置能匹配到的最远的位置是多少.(就是当前点减去匹配长度) 之后--考虑DP- ...

  5. MongoDB复制集高可用选举机制(三)

    复制集高可用选举机制 在上一章介绍了MongoDB的架构,复制集的架构直接影响着故障切换时的结果.为了能够有效的故障切换,请确保至少有一个节点能够顺利升职为主节点.保证在拥有核心业务系统的数据中心中拥 ...

  6. Tensorboard 的简单使用

    确保环境以及安装好tensorflow以及tensorboard 下面通过一个简单的例子来显示一下使用方式,一个向量加法的图结构. import tensorflow as tf a = tf.con ...

  7. OCX控件避免弹出安全警告的类

    1.要加一个头文件:         #include <objsafe.h>2.在控件头文件中加入: 1 DECLARE_INTERFACE_MAP()2 BEGIN_INTERFACE ...

  8. CSS:CSS 选择器参考手册

    ylbtech-CSS:CSS 选择器参考手册 1.返回顶部 1. 我们会定期对 W3School 的 CSS 参考手册进行浏览器测试. CSS3 选择器 在 CSS 中,选择器是一种模式,用于选择需 ...

  9. node.js 安装 和 配置Sublime Text的Node.js

    安装node.js 第一步:下载安装文件: https://nodejs.org/en/download/ 第二步:安装nodejs 下载完成之后,双击"node-v6.10.1-x64.m ...

  10. char的定义在iOS和Android下是不同的

    char is different in iOS and Android!跨平台开发时很容易忽略的非常坑爹的一个区别. 我的需求是实现一个算法,这个算法在iOS和Android下需要保持一致的结果,很 ...