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;
}