题目大意:求最长回文
思路:manacher 模版
WA:写成了n*n的复杂度了
AC代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 110010
using namespace std;
int manacher(char a[],int n)
{
int ans = 0;
int mx = 0;
int p = 0;
int r[2*N];
memset(r,0,sizeof r);
for(int i = 1; i <= n; i++)
{
if(i < mx)
r[i] = min(r[2*p - i], mx-i);
else
r[i] = 1;
while(a[i-r[i]] == a[i+r[i]])
r[i]++;
if(i+r[i] > mx)
{
p = i;
mx = r[i]+i;
}
ans = max(ans,r[i]);
}
return ans-1;
}
int main()
{
char ch[N],st[2*N];
while(~scanf("%s", ch))
{
int n = strlen(ch);
st[0] = 'S';
st[1] = '#';
st[2*n+2] = '\0';
for(int i = 1; i <= n; i++)
{
st[2*i+1] = '#';
st[2*i] = ch[i-1];
}
printf("%d\n",manacher(st,2*n+1));
}
}
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 110010
using namespace std;
int manacher(char a[],int n)
{
int ans = 0;
int mx = 0;
int r[2*N];
memset(r,0,sizeof r);
for(int i = 1; i <= n; i++)
{
if(i < mx)
r[i] = min(r[2*mx - i], mx-i);//这里应该是min(r[2*p-i],mx-i)
else
r[i] = 1;
while(a[i-r[i]] == a[i+r[i]])
r[i]++;
if(i+r[i] > mx)
mx = r[i]+i;
ans = max(ans,r[i]);
}
return ans-1;
}
int main()
{
char ch[N],st[2*N];
while(~scanf(" %s", ch))
{
int n = strlen(ch);
st[0] = 'S';
st[1] = '#';
st[2*n+2] = '\0';
for(int i = 1; i <= n; i++)
{
st[2*i+1] = '#';
st[2*i] = ch[i-1];
}
printf("%d\n",manacher(st,2*n+1));
}
}