manacher模板

既然大家都知道回文串是怎么回事了,那我们就长话短说,现在有一个字符串,长度小于1200,我想知道最长的回文子串长度是多少。 

输入描述:

多组输入,输入字符串只包含小写字母。

输出描述:

每组输出一个数字,表示最长的回文子串。

示例1

输入

复制

aqppqole
ebcml

输出

复制

4
1
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define int long long
#define MAXN 11000010
int p[MAXN * 2 + 2] = { 0 };
int manacher(string s) {
	int n = s.size();
	for (int i = n; i >= 0; i--)
		s.insert(i, "#");
	n = s.size();
	int mx = -1, id = 0; int ans = 0;
	for (int i = 0; i < n; i++) {
		p[i] = i < mx ? min(p[id * 2 - i], mx - i + 1) : 1;
		while (i + p[i] < n && i - p[i] >= 0 && s[i + p[i]] == s[i - p[i]]) p[i]++;
		if (i + p[i] - 1 > mx) mx = i + p[i] - 1, id = i;
		ans = max(ans, p[i] - 1);
	}
	return ans;
}
signed main() {
	ios::sync_with_stdio(false); cin.tie(0);
	string s;
	while (cin >> s) {
		int ans = manacher(s);
		cout << ans << endl;
	}
	return 0;
}

 

你可能感兴趣的:(manacher模板)