Manacher 版本(学习这个板子)
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#define LL long long
#define mem(a, b) memset(a, b, sizeof(a))
#define N 1000010
using namespace std;
char s[N], s_new[N*2];
int p[N*2];
int init() {
int len=strlen(s);
s_new[0]='$';
s_new[1]='#';
int j=2;
for(int i=0; i<len; i++) {
s_new[j++]=s[i];
s_new[j++]='#';
}
s_new[j]='\0';
return j;
}
int Manacher() {
int len=init();
int max_len=-1;
int id, mx=0;
for(int i=1; i<len; i++) {
if(i<mx)
p[i]=min(p[2*id-i], mx-i);
else p[i]=1;
while(s_new[i-p[i]]==s_new[i+p[i]])
p[i]++;
if(mx<i+p[i]) {
id=i;
mx=i+p[i];
}
max_len=max(max_len, p[i]-1);
}
return max_len;
}
int main() {
int cas=1;
while(scanf("%s", s)!=EOF) {
if(strcmp(s,"END")==0) break;
printf("Case %d: %d\n", cas++, Manacher());
}
}
然后按照书上的,用Hash+二分
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<vector>
#include<cmath>
#define LL long long
#define mem(a, b) memset(a, b, sizeof(a))
#define N 1000010
using namespace std;
char s[N];
unsigned LL p[N], f1[N], f2[N];
int n;
bool check(int i, int len) {
if(f1[i]-f1[i-len-1]*p[len+1]==f2[i]-f2[i+len+1]*p[len+1])
return 1;
else return 0;
}
bool check2(int i, int len) {
if(f1[i]-f1[i-len-1]*p[len+1]==f2[i+1]-f2[i+len+2]*p[len+1])
return 1;
else return 0;
}
int hash1(int i) {
int l=0, r=min(i-1, n-i);
while(l<r) {
int mid=(l+r+1)>>1;
if(check(i,mid)) l=mid;
else r=mid-1;
}
return l*2+1;
}
int hash2(int i) {
int l=0, r=min(i-1, n-i)+1;
while(l<r) {
int mid=(l+r+1)>>1;
if(check2(i, mid)) l=mid;
else r=mid-1;
}
return (l+1)*2;
}
int main() {
int cas=1;
while(scanf("%s", s+1)!=EOF) {
if(strcmp(s+1,"END")==0) break;
n=strlen(s+1);
p[0]=1, f1[0]=0, f2[n+1]=-1;//处理一下边界
for(int i=1; i<=n; i++) {
f1[i]=f1[i-1]*131+(s[i]-'a'+1);
p[i]=p[i-1]*131;
}
for(int i=n; i>=1; i--)
f2[i]=f2[i+1]*131+(s[i]-'a'+1);
int maxx=1;
for(int i=2; i<=n; i++) {
maxx=max(hash1(i), max(hash2(i), maxx));
}
printf("Case %d: %d\n", cas++, maxx);
}
}