几个月没写马拉车了,比赛的时候调了半天,代码也写的极丑
题意:
给你字符串s,让你找到一个最长的回文串a+b,字符串a为s的前缀,b为s的后缀
题解:
先对s做一遍马拉车
细分有四种情况:
1.b为空,即最长的回文串就是某前缀,代码中该长度记为le
2.a为空,即最长的回文串就是某后缀,代码中该长度记为ri
3.a>=b,a的前b个字符与b对应为回文串,a串后(a-b)为回文串。代码中old=min(a,b),tmp=max(a,b)-min(a,b)
4.a<b,b的后a个字符与a对应为回文串,b串前(b-a)为回文串。代码中old=min(a,b),tmp=max(a,b)-min(a,b)
注意下细节,边界情况的考虑。为了简单计算,在马拉车过后的Mp[]数组上进行分析
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000050;
char Ma[maxn*2];
int Mp[maxn*2];
int Manacher(char s[],int len)
{
int l = 0;
Ma[l++] = '$';
Ma[l++] = '#';
for(int i = 0; i<len; i++)
{
Ma[l++] = s[i];
Ma[l+