最長迴文子串 V2(Manacher演算法)

brucehb發表於2017-05-30
迴文串是指aba、abba、cccbccc、aaaa這種左右對稱的字串。
輸入一個字串Str,輸出Str裡最長迴文子串的長度。
Input
輸入Str(Str的長度 <= 100000)
Output
輸出最長迴文子串的長度L。
Input示例
daabaac
Output示例
5

#include <iostream>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;

int fun(string &str)
{
	string temp;
	int len = str.length();
	temp += '@';
	for (int i = 0; i < len; i++)
	{
		temp += '#';
		temp += str[i];
	}

	temp += '#';
	temp += '&';

	int size = len*2 + 1;
	int pos = 0;
	int right = 0;
	int result = 0;
	int buf[size];

	for (int i = 1; i < size; i++)
	{
		if (i < right)
		{
			buf[i] = min(buf[2*pos-i], right-i);
		}
		else
		{
			buf[i] = 1;
		}

		while (temp[i-buf[i]] == temp[i+buf[i]])
		{
			buf[i]++;
		}

		if (i+buf[i] > right)
		{
			pos = i;
			right = i+buf[i];
		}

		result = max(result, buf[i]);
	}

	return result-1;
}

int main()
{
	string str;
	cin >> str;
	cout << fun(str) << endl;

    return 0;
}


相關文章