1. 程式人生 > >manacher's algorithm尋找最長迴文子串

manacher's algorithm尋找最長迴文子串

manacher’s algorithm尋找最長迴文子串

#include <vector>
#include <iostream>
#include <string>

using namespace std;

string Manacher(string s) {
	// Insert '#'
	string t = "$#";
	for (int i = 0; i < s.size(); ++i) {
		t += s[i];
		t += "#";
	}
	// Process t
	vector<int> p(t.size(), 0);
	int
mx = 0, id = 0, resLen = 0, resCenter = 0; for (int i = 1; i < t.size(); ++i) { if(mx > i) { if(p[2 * id - i] < mx - i) //基於id對稱 p[i] = p[2 * id - i]; else //超過mx-i的部分,一個一個匹配 p[i] = mx - i; } else //i在mx的外邊,重新匹配 p[i] = 1; while (t[i + p[i]] == t[i - p[i]
]) p[i]++; if (mx < i + p[i]) { mx = i + p[i]; id = i; } if (resLen < p[i]) { resLen = p[i]; resCenter = i; } } return s.substr((resCenter - resLen) / 2, resLen - 1); } int main() { string s1 = "Is PAT&TAP symmetric?"; cout << Manacher(s1) << endl; }

在這裡插入圖片描述