码迷,mamicode.com
首页 > 编程语言 > 详细

最长回文子串---Manacher算法

时间:2016-09-03 13:38:05      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

百度:Manacher算法

代码

#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

int MANACHER(const string &str)
{
    string data;
    int len = str.length();
    data+="$#";
    for (int i=0;i<len;i++)
    {
        data+=str[i];
        data+=#;
    }
    data+=@;
    //到此预处理完成
    len = data.length();
    int *temp = new int[len+2];
    memset(temp,0,sizeof(temp));
    int MaxIndex=0;
    int i=1,index=0,res=0;
    
    for(;i<len;i++)
    {
        if (MaxIndex>i)
        {
            temp[i]=(MaxIndex-i<temp[2*index-i]?MaxIndex-i:temp[2*index-i]);
        }
        else
            temp[i]=1;

        while (data[i-temp[i]] == data[i+temp[i]])
        {
            temp[i]++;
        }
        if(i+temp[i] > MaxIndex)
        {
            MaxIndex = i+temp[i];
            index=i;
            
        }
        res = (res>temp[i]?res:temp[i]);
        
        
    }

    delete[]temp;
    return res-1;

}

int main()
{
    string str ;
    int n;
    while(cin >> n)
    {
        while (n--)
        {
            cin >> str;
            
            cout << MANACHER(str)<<endl;
        }
    }
    
    return 0;
}

 

最长回文子串---Manacher算法

标签:

原文地址:http://www.cnblogs.com/LCCRNblog/p/5836845.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!