#include<stdio.h>
#include<string.h>
#define maxn 501000
char s[maxn],t[maxn];
int next[maxn],extand1[maxn],extand2[maxn];
int ans[],sum[maxn];
void getnext(int *next,char *t)
{
int i,k,j,len=strlen(t);
next[]=len;
i=;
while(i<len-&&t[i]==t[i+])
{
i++;
}
next[]=i;
int a=;
for(k=;k<len;k++)
{
int p=next[a]+a-;
int l=next[k-a];
if(k-+l>=p)
{
int j=p-k+>?p-k+:;
while(k+j<len&&t[k+j]==t[j])
j++;
next[k]=j;
a=k;
}
else next[k]=l;
}
}
void ekmp(char *s,char *t,int *next,int *extand)
{
int i,j,slen=strlen(s),tlen=strlen(t),k;
getnext(next,t);//求next数组
/*
for(i=0;i<tlen;i++)
printf("%d ",next[i]);
printf("\n");
*/
int minlen=slen<tlen?slen:tlen;
int a=;
while(a<minlen&&s[a]==t[a]) a++;
extand[]=a;
a=; for(k=;k<slen;k++)
{
int p=a+extand[a]-;
int l=next[k-a];
if(k-+l>=p)
{
int j=p-k+>?p-k+:;
while(k+j<slen&&j<tlen&&s[k+j]==t[j])
j++;
extand[k]=j;
a=k;
}
else extand[k]=l;
}
/*for(i=0;i<slen;i++)
printf("%d ",extand[i]);
printf("\n");*/
}
int main()
{
int i,j,te;
scanf("%d",&te);
while(te--)
{
for(i=;i<;i++)
scanf("%d",&ans[i]);
scanf("%s",s);
int len=strlen(s);
for(i=;i<len;i++)
{
t[len-i-]=s[i];
if(i==)
sum[i]=ans[s[i]-'a'];
else
sum[i]=sum[i-]+ans[s[i]-'a'];
}
t[len]='\0';
ekmp(s,t,next,extand1);//s做主串
ekmp(t,s,next,extand2);//t做主串 /*for(i=0;i<len;i++)
{
printf("%d ",extand1[i]);
}
printf("\n");
for(i=0;i<len;i++)
{
printf("%d ",extand2[i]);
}
printf("\n");*/ int max=-;
int ret;
for(i=;i<len;i++)
{
ret=;
if(extand1[i]+i==len)
{
ret+=sum[len-]-sum[i-];
}
if(extand2[len-i]==i)//len-i表示t中的位置
{
ret+=sum[i-];
}
if(ret>max)
max=ret;
}
printf("%d\n",max);
}
}

hdu3613 扩展KMP的更多相关文章

  1. hdu3613 Best Reward 扩展kmp or O(n)求最大回文子串

    /** 题目:hdu3613 Best Reward 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题意:有一个字符串,把他切成两部分. 如果这部 ...

  2. HDU3613 Best Reward —— Manacher算法 / 扩展KMP + 枚举

    题目链接:https://vjudge.net/problem/HDU-3613 Best Reward Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  3. [扩展KMP][HDU3613][Best Reward]

    题意: 将一段字符串 分割成两个串 如果分割后的串为回文串,则该串的价值为所有字符的权值之和(字符的权值可能为负数),否则为0. 问如何分割,使得两个串权值之和最大 思路: 首先了解扩展kmp 扩展K ...

  4. 扩展KMP题目

    hdu4333 /* 题意:字符串s[0..n-1],每次把最后一个字符放到前面,求形成的字符串比最初串分别小,相同,大于的个数 因为是为了练习扩展KMP所以肯定是扩展KMP, 为了循环方便,在后面复 ...

  5. KMP 、扩展KMP、Manacher算法 总结

    一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...

  6. ACM之路(12)—— KMP & 扩展KMP & Manacher

    最近做完了kuangbin的一套关于kmp的题目(除了一道字典树的不会,因为还没学字典树所以先放放),做个总结.(kuangbin题目的链接:http://acm.hust.edu.cn/vjudge ...

  7. 扩展KMP算法

    一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...

  8. 扩展KMP --- HDU 3613 Best Reward

    Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...

  9. KMP和扩展KMP

    文章网上太多这里提一下代码细节: KMP: scanf("%s\n",s); scanf("%s\n",t); int ls=strlen(s),lt=strl ...

随机推荐

  1. 二分+DP HDU 3433 A Task Process

    HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  2. 边工作边刷题:70天一遍leetcode: day 85

    Find the Celebrity 要点: 这题从solution反过来想比较好:loop through n同时maintain一个candidate:如果cand认识某个i,那么modify c ...

  3. eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?

    对于编程人员来说,要记住大量的类名或类方法的名字,着实不是一件容易的事情.如果要IDE能够自动补全代码,那将为我们编程人员带来很大帮助. eclipse代码里面的代码提示功能默认是关闭的,只有输入“. ...

  4. awk 和 sed 使用案例

    1.模仿wc的行为,统计一个文本文件的文件的字符数.行数.单词数. awk '{numOfChar+=length($0);numOfWord+=NF}END{print numOfChar" ...

  5. Git之分支创建策略

    分支策略:git上始终保持两个分支,master分支与develop分支.master分支主要用于发布时使用,而develop分支主要用于开发使用. 创建master的分支developgit che ...

  6. 【转】【MMX】 基于MMX指令集的程序设计简介

    (一) MMX技术简介 Intel 公司的MMX™(多媒体增强指令集)技术可以大大提高应用程序对二维三维图形和图象的处理能力.Intel MMX技术可用于对大量数据和复杂数组进行的复杂处理,使用MMX ...

  7. 微软职位内部推荐-UX Designer II

    微软近期Open的职位: Search Technology Center Asia (STCA) Position: UX Designer Location: Beijing, China Sea ...

  8. Vue.js的表格分页组件

    转自:http://www.cnblogs.com/Leo_wl/p/5522299.html 有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更 ...

  9. Linux第八次学习笔记

    系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 输入操作是从I/O设备拷贝数据到主存. I/O→主存 输出操作是从主存拷贝数据到I/O设备. 主存→I/O Unix I/O ...

  10. initWithNibName&initWithCoder &awakeFromNib&UIView常见属性方法

    第一.initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的. 第 二.initWithCoder 是一个类在IB中创建 ...