标签:
Description
Input
Output
Sample Input
Sample Output
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; const int N=500005; int v[30],p[2*N],d1[2*N],d2[2*N]; char s[2*N],str[2*N]; int n; void kp() { int mx=0; int id; ///for(i=n;str[i]!=0;i++) ///str[i]=0; ///没有这一句有问题,就过不了ural1297,比如数据:ababa aba; for(int i=1;i<n;i++) { if(mx>i) p[i]=min(p[2*id-i],p[id]+id-i); else p[i]=1; for( ;str[i+p[i]]==str[i-p[i]];p[i]++); if(p[i]+i>mx) { mx=p[i]+i; id=i; } } } void init() { str[0]=‘$‘; str[1]=‘#‘; for(int i=0;i<n;i++) { str[i*2+2]=s[i]; str[i*2+3]=‘#‘; } n=n*2+2; s[n]=0; } int main() { int T; scanf("%d",&T); while(T--) { for(int i=1;i<=26;i++) scanf("%d",&v[i]); scanf("%s",s); n=strlen(s); init(); kp(); d1[0]=0; for(int i=1;i<n;i++) { if(str[i]==‘#‘) d1[i]=d1[i-1]; else d1[i]=d1[i-1]+v[str[i]-‘a‘+1]; } d2[n]=0; for(int i=n-1;i>0;i--) { if(str[i]==‘#‘) d2[i]=d2[i+1]; else d2[i]=d2[i+1]+v[str[i]-‘a‘+1]; } int sum,tmp=-99999999; for(int i=2;i<n-2;i=i+2) { sum=0; if(p[(i+2)/2]*2-1>=i+1) sum+=d1[i]; if(p[(n+i)/2]*2-1>=n-i-1) sum+=d2[i+1]; if(sum>tmp) tmp=sum; } printf("%d\n",tmp); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chen9510/p/5426676.html