本来想练EX_KMP的,一读题发现是回文串,与回文串有关的一定要用神器manacher啊!!!然后就用manacher写了。。
manacher出所有的回文串半径,然后预处理一遍,最后统计最大值。从左边延续过来的回文串,要看右边有没有构成回文,反之亦然。。。
2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 aba 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 acacac
1 6
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=550000; const int INF=0x3f3f3f3f; char str[maxn],ans[maxn*2]; int p[maxn*2],table[30],sum[maxn*2]; int pal[maxn*2],par[maxn*2]; void pre() { int tot=1; memset(ans,0,sizeof(ans)); ans[0]=‘$‘; int len=strlen(str); for(int i=0;i<len;i++) { ans[tot]=‘#‘; tot++; ans[tot]=str[i]; tot++; } ans[tot]=‘#‘; } void manacher() { pre(); memset(p,0,sizeof(p)); int len=strlen(ans); int mid=-1,mx=-1; for(int i=0;i<len;i++) { int j=-1; if(i<mx) { j=2*mid-i; p[i]=min(p[j],mx-i); } else p[i]=1; while(i+p[i]<len&&ans[i+p[i]]==ans[i-p[i]]) p[i]++; if(p[i]+i>mx) { mx=p[i]+i;mid=i; } } } int main() { int T_T; scanf("%d",&T_T); while(T_T--) { for(int i=0;i<26;i++) scanf("%d",table+i); scanf("%s",str); manacher(); sum[0]=0; int sz=strlen(ans); for(int i=1;i<sz;i++) { sum[i]=sum[i-1]; if(ans[i]>=‘a‘&&ans[i]<=‘z‘) { sum[i]+=table[ans[i]-‘a‘]; } } ans[1]=‘$‘; ans[sz-1]=‘$‘; int ret=-INF; memset(pal,0,sizeof(pal)); memset(par,0,sizeof(par)); for(int i=2;i<sz;i++) { int r=p[i]-1; int L=i-r,R=i+r; if(ans[L]==‘$‘&&ans[R]==‘$‘) continue;///必须要割两段 if(ans[L]==‘$‘) { ///后一半可能是回文串,要把结果记录到右端点去 par[R]=sum[R]; if(!(ans[R]>=‘a‘&&ans[R]<=‘z‘)) par[R-1]=sum[R]; else par[R+1]=sum[R]; } else if(ans[R]==‘$‘) { ///前一半可能是回文串,要把结果记录到左端点去 int temp=sum[R]-sum[L-1]; pal[L]=temp; if(!(ans[L]>=‘a‘&&ans[L]<=‘z‘)) pal[L+1]=temp; else pal[L-1]=temp; } } ///统计答案 for(int i=2;i<sz;i++) { int r=p[i]-1; int L=i-r,R=i+r; if(ans[L]==‘$‘&&ans[R]==‘$‘) continue;///必须要割两段 if(ans[L]==‘$‘) { ret=max(ret,sum[R]+pal[R+1]); } else if(ans[R]==‘$‘) { int temp=sum[R]-sum[L-1]; ret=max(ret,temp+par[L-1]); } else ret=max(0,ret); ///当存在负数值的时候0可能是最大的 } printf("%d\n",ret); } return 0; }
HDOJ 3613 Best Reward,布布扣,bubuko.com
原文:http://blog.csdn.net/u012797220/article/details/22744671