我在学习manacher,看到所有的题解都是单独记录了一个maxr,但是我觉得maxr就是p[mid]+mid啊?是不是完全可以不用maxr啊?
附本人不用maxr的代码,发现AC了。
#include<bits/stdc++.h>
using namespace std;
#define MAX 22000010
int p[MAX];
char s[MAX], ss[MAX];
int main()
{
scanf("%s",ss + 1);
int n = strlen(ss + 1);
s[0] = '!';s[1] = '#';
for(int i = 1;i <= n;++i)
{
s[i << 1] = ss[i];
s[i << 1 | 1] = '#';
}
s[(n << 1) + 2] = '@';
n = n << 1 | 1;
int mid = 0, ans = 1;
for(int i = 1;i <= n;++i)
{
if(i < p[mid] + mid) p[i] = min(p[(mid << 1) - i], mid + p[mid] - i);
else p[i] = 1;
while(s[i - p[i]] == s[i + p[i]]) ++p[i];
if(i + p[i] > mid + p[mid]) mid = i;
if(p[i] > ans) ans = p[i];
}
printf("%d\n",ans - 1);
return 0;
}
只是请教一下这个maxr是不是不必要,担心有毒瘤hack数据会把我代码炸掉