传送门:https://www.luogu.org/problem/P3805
思路:一道马拉车算法的裸题,直接输入输出套板子,注意不能在for循环中用strlen(s)测长度,要在for循环外将此值赋值到某个变量中,否则会超时,然后将更新所得的最大值-1就是答案
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxlen = 33000030;
int len = 2;
int ans = -1;
int r[maxlen];
char s[maxlen];
char ss[maxlen];
void manacher()
{
ss[0] = '~';
ss[1] = '#';
int lens = strlen(s);//放到变量外 否则会超时
for(int i = 0; i < lens; i++)
{
ss[len++] = s[i];
ss[len++] = '#';
}
ss[len] = '$';
int max_r = 1;
int pos = 1;
for(int i = 1; i < len; i++)
{
if(max_r > i)
r[i] = min(max_r - i, r[2 * pos - i]);
else
r[i] = 1;
while( ss[i + r[i] ] == ss[i - r[i] ])
r[i]++;
if(r[i] + i > max_r)
{
max_r = r[i] + i;
pos = i;
}
ans = max(r[i], ans);
}
}
int main()
{
scanf("%s", s);
manacher();
cout << ans - 1 << endl;
}