算法的核心就在这一句上了: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 ;
}

最新文章

  1. 外景VR的应用
  2. kaungbin_DP S (POJ 3666) Making the Grade
  3. 什么是SQL注入式攻击
  4. android中常见对话框之一AlertDialog
  5. Ruby Numeric
  6. swift 与 指针初级使用
  7. Azure SQL 数据库新服务级别现已正式发布
  8. zip file 压缩文件
  9. Java基础知识强化77:正则表达式之获取功能(Pattern 和 Matcher类的使用)
  10. Linq 导出Excel
  11. WPF/Silverlight中的RichTextBox总结
  12. Python中模块之random的功能介绍
  13. SpriteBuilder代码中弱引用(weak)需要注意的地方
  14. 解除vnc viewer键盘快捷键的禁用
  15. SpringBoot 部署到linux环境
  16. [转]docker之Dockerfile实践
  17. springboot----&gt;java.lang.IllegalArgumentException
  18. mock生成随机数的各种情况
  19. ASP.NET Web Pages:全局页面
  20. Netty源码分析第6章(解码器)----&gt;第1节: ByteToMessageDecoder

热门文章

  1. spring和springmvc中,Configuration注解Bean重复加载
  2. bzoj4485: [Jsoi2015]圈地
  3. BZOJ1086 王室联邦 —— 树分块
  4. Java线程面试题 Top 50(转载)
  5. Android图片加载神器之Fresco, 基于各种使用场景的讲解
  6. Python之Numpy详细教程
  7. 深入理解java虚拟机----&gt;java内存区域与内存溢出异常
  8. P4147玉蟾宫——最大子矩阵
  9. 洛谷P1073最优贸易——双向取值
  10. windows install JDK&amp;&amp;JRE