L2-008 最长对称子串

L2-008 最长对称子串

题意

给你一个字符串(可以带空格),求它的最大回文子串。

思路

直接马拉车就行,注意开头用下getline就行,没搞懂网上的别的解法什么鬼,第一反应居然不是马拉车。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <string>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define mem(a, b) memset(a, b, sizeof(a))
#define pb push_back
#define ll long long
using namespace std;
const double PI = acos(-1.0);
const int N = 2e5 + 10;
const int mod = 1e9 + 7;
/////////////////////////////////////////
string a;
string b;
int p[N];
int pre()
{
	b.erase(b.begin(), b.end());
	int len = a.size();
	b += "$#";
	int j = 2;
	for (int i = 0; i < len; i++)
	{
		b += a[i];
		b += '#';
		j += 2;
	}
	return j;
}
int manacher()
{
	int len = pre();
	int ans = -inf, id, mx = 0;
	for (int i = 1; i < len; i++)
	{
		if (i < mx)
			p[i] = min(p[id * 2 - i], mx - i);
		else
			p[i] = 1;
		while (b[i - p[i]] == b[i + p[i]])
			p[i]++;
		if (mx < i + p[i])
			id = i, mx = i + p[i];
		ans = max(ans, p[i] - 1);
	}
	return ans;
}
int main()
{
	getline(cin,a);
	cout<<manacher()<<endl;
	return 0;
}
原文地址:https://www.cnblogs.com/Aracne/p/13773324.html