您的位置:首页 > 其它

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

2016-09-03 13:21 281 查看

百度: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;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: