HDU 3068
杭电上关于manacher一道应用,做完POJ的,顺手过了这道题
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <stack>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxl= 110005;
const int maxp= maxl<<1;
char s[maxl];
int p[maxp];
inline char SS(int x, int l)
{
char c;
if (x< 1){
c= '^';
}
else if (x> l){
c= '$';
}
else{
c= x & 1 ? '#' : s[x>>1];
}
return c;
}
int Man(int l)
{
l<<= 1;
++l;
memset(p, 0, sizeof(p));
int R= -1, mid= 0;
int ans= -1;
for (int i= 1; i<= l; ++i){
if (i< R){
int mir= p[(mid<<1)-i];
if (mir< R-i){
p[i]= mir;
}
else{
int j;
for (j= '#'== SS(R, l) ? R : R+1; SS(1+j, l) == SS((i<<1)-j-1, l); j+= 2){
}
if (j> R){
R= j;
mid= i;
}
p[i]= R-i;
}
}
else{
int j;
for (j= '#'== SS(i, l) ? i : i+1; SS(1+j, l) == SS((i<<1)-j-1, l); ++j){
}
R= j;
mid= i;
p[i]= R-i;
}
if (p[i]> ans){
ans= p[i];
}
}
return ans;
}
int main()
{
while (~scanf(" %s", s+1)){
printf("%d\n", Man(strlen(s+1)));
}
return 0;
}

浙公网安备 33010602011771号