新建一个串为给定串的反转,
原串跟新串匹配求得是前缀回文,
新串跟原串匹配求得是后缀回文。
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
int va[30],pre[510000],last[510000],nexta[510000],nextb[510000],l;
string a,b;
bool sumPre[510000],sumLast[510000];
void getNext(string a,int *nexta,int la)
{
int i=0,j = -1;
nexta[0] = -1;
while(i<la)
{
if(a[i]==a[j]||j==-1)
{
i++,j++;
nexta[i] = j;
}
else j = nexta[j];
}
}
void kmp(string a,int la,string b,int *nexta,bool *sum)
{
int i=0,j=0;
while(j<l)
{
if(a[i]==b[j]||i==-1)
{
i++;j++;
}
else i = nexta[i];
}
int pre = i;
while(pre)
{
sum[pre] = true;
pre = nexta[pre];
}
}
int main()
{
int t;
ios::sync_with_stdio(false);
scanf("%d",&t);
while(t--)
{
for(int i=0;i<26;i++) scanf("%d",&va[i]);
cin>>a;
l = a.size();
int sum = 0;
for(int i=0;i<=l;i++)
{
sumPre[i] = false;
sumLast[i] = false;
}
for(int i=0;i<l;i++)
{
sum+=va[a[i]-'a'];
pre[i] = sum;
}
sum = 0;
for(int i=l-1;i>=0;i--)
{
sum+=va[a[i]-'a'];
last[i] = sum;
}
b = a;
reverse(b.begin(),b.end());
getNext(a,nexta,l);
kmp(a,l,b,nexta,sumPre);
getNext(b,nextb,l);
kmp(b,l,a,nextb,sumLast);
int ans = -1000000000;
for(int i=0;i<l-1;i++)
{
sum = 0;
//printf("%d %d\n",sumPre[i+1],sumLast[l-i-1]);
if(sumPre[i+1])sum+=pre[i];
if(sumLast[l-i-1])sum+=last[i+1];
ans = max(ans,sum);
}
printf("%d\n",ans);
}
return 0;
}