【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=3613

【题目大意】

  一个字符串的价值定义为,当它是一个回文串的时候,价值为每个字符的价值的和,如果不是回文串,价值为0,现在给出每种字符的价值。给出一个字符串,要求将其划分为两个子串,要求两个子串的价值和最大。

【题解】

  求出字符串S的反串T,以T为模板跑一遍S的exkmp就能得到S的后缀是否为回文串的信息,同理以S为模板跑一遍T就可以得到S的前缀是否是回文串的信息,枚举每个断点,取最大值即可。

【代码】

#include <cstdio>
#include <cstring>
using namespace std;
const int N=500010;
int len,LCP[N],ex1[N],ex2[N],a[N],s[N];
char S[N],T[N];
void getLCP(char *T){
int i,len=strlen(T);
LCP[0]=len;
for(i=0;i<len-1&&T[i]==T[i+1];i++);
LCP[1]=i; int a=1;
for(int k=2;k<len;k++){
int p=a+LCP[a]-1,L=LCP[k-a];
if((k-1)+L>=p){
int j=(p-k+1)>0?(p-k+1):0;
while(k+j<len&&T[k+j]==T[j])j++;
LCP[k]=j,a=k;
}else LCP[k]=L;
}
}
void exkmp(char *S,char *T,int *extend){
memset(LCP,0,sizeof(LCP));
getLCP(T);
int Slen=strlen(S),Tlen=strlen(T),a=0;
int MinLen=Slen>Tlen?Tlen:Slen;
while(a<MinLen&&S[a]==T[a])a++;
extend[0]=a,a=0;
for(int k=1;k<Slen;k++){
int p=a+extend[a]-1,L=LCP[k-a];
if((k-1)+L>=p){
int j=(p-k+1)>0?(p-k+1):0;
while(k+j<Slen&&j<Tlen&&S[k+j]==T[j])j++;
extend[k]=j;a=k;
}else extend[k]=L;
}
}
void revcpy(char* S,char* T,int len){
memset(T,0,sizeof(T));
for(int i=0,k=len-1;i<len;++i,--k)T[i]=S[k];
}int Cas;
int main(){
scanf("%d",&Cas);
while(Cas--){
for(int i=0;i<26;i++)scanf("%d",&a[i]);
scanf("%s",S);len=strlen(S);
for(int i=0;S[i];i++)s[i+1]=s[i]+a[S[i]-'a'];
revcpy(S,T,len);
exkmp(S,T,ex2);
exkmp(T,S,ex1);
int ans=-1e9;
for(int i=0;i<len;i++){
if(i&&ex1[i]+i==len){
int j=ex1[i],tmp=s[j];
if(ex2[j]+j==len)tmp+=s[len]-s[j];
if(tmp>ans)ans=tmp;
}else{
int j=i+1,tmp=0;
if(ex2[j]+j==len)tmp+=s[len]-s[j];
if(tmp>ans)ans=tmp;
}
}printf("%d\n",ans);
}return 0;
}

HDU 3613 Best Reward(扩展KMP)的更多相关文章

  1. HDU 3613 Best Reward(扩展KMP求前后缀回文串)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...

  2. HDU 3613 Best Reward ( 拓展KMP求回文串 || Manacher )

    题意 : 给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串,那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果不是回文串,那么这串价值就为0.问 ...

  3. HDU 3613 Best Reward 正反两次扩展KMP

    题目来源:HDU 3613 Best Reward 题意:每一个字母相应一个权值 将给你的字符串分成两部分 假设一部分是回文 这部分的值就是每一个字母的权值之和 求一种分法使得2部分的和最大 思路:考 ...

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

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

  5. HDU - 3613 Best Reward(manacher或拓展kmp)

    传送门:HDU - 3613 题意:给出26个字母的价值,然后给你一个字符串,把它分成两个字符串,字符串是回文串才算价值,求价值最大是多少. 题解:这个题可以用马拉车,也可以用拓展kmp. ①Mana ...

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

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

  7. HDU 4333 Revolving Digits 扩展KMP

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意:给以数字字符串,移动最后若干位到最前边,统计得到的数字有多少比原来大,有多少和原来同样,有多少 ...

  8. S - Best Reward 扩展KMP

    After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...

  9. HDU 4333 Revolving Digits [扩展KMP]【学习笔记】

    题意:给一个数字,每一次把它的最后一位拿到最前面,一直那样下去,分别求形成的数字小于,等于和大于原来数的个数. SAM乱搞失败 当然要先变SS了 然后考虑每个后缀前长为n个字符,把它跟S比较就行了 如 ...

  10. hdu 3613"Best Reward"(Manacher算法)

    传送门 题意: 国王为了犒劳立下战功的大将军Li,决定奖给Li一串项链,这个项链一共包含26中珠子"a~z",每种珠子都有 相应的价值(-100~100),当某个项链可以构成回文时 ...

随机推荐

  1. mysql 存储过程中的declare 和 set @的两种变量的区别

    两者在手册中的说明: DECLARE var_name[,...] type [DEFAULT value]这个语句被用来声明局部变量.要给变量提供一个默认值,请包含一个DEFAULT子句.值可以被指 ...

  2. hadoop笔记之Hive的数据类型

    Hive的数据类型 Hive的数据类型 前面说过,Hive是一个数据仓库,相当于一个数据库.既然是数据库,那么就必须能创建表,既然有表,那么当中就有列,列中就有对应的类型 总的来讲,hive的数据类型 ...

  3. 安装GNUstep并运行第一个objc程序

    在windows环境下安装GNUstep,运行objective-c程序,今天试了一下,记录一下操作步骤, 1,登陆http://ftpmain.gnustep.org/pub/gnustep/bin ...

  4. Flink资料(8) -- Flink代码贡献的指导及准则

    本文翻译自Contributing Code ----------------------------------------- Apache Flink是由自愿的代码贡献者维护.优化及扩展的.Apa ...

  5. 向mysql添加新用户并分配权限

    首先要声明一点,大部分情况下,修改MySQL是需要有mysql里的root权限的,所以一般用户无法更改密码,除非请求管理员. 方法一使用phpmyadmin,这是最简单的了,修改mysql库的user ...

  6. [转]struct 用法深入探索

    struct用法深入探索 作者: Cloudward 1. struct的巨大作用 面对一个人的大型C/C++程序时,只看其对struct的使用情况我们就可以对其编写者的编程经验进行评估.因为一个大型 ...

  7. MVC自学第四课

    处理表单 前面的列子我们已经把表单提交给了HomeControllers类中的RsvpForm动作方法,只是在这个动作方法内,我们并没有做什么具体的逻辑处理,而是直接返回一个 “Thanks”的视图. ...

  8. 查询linux发行版本号方法总结

      了解Linux发行版本的版本号是一项非常重要的事情,大多数软件对系统的版本都有要求,发行版本号与软件不匹配,软件将无法安装或者无法使用.这边集合市面上流行的Linux发行版本版本号查询方法.有了这 ...

  9. 坑爹JDK8,可怜的XP

    如题: 看看这个: http://stackoverflow.com/questions/20965564/installing-jdk8-on-windows-xp-advapi32-dll-err ...

  10. 通过crash了解linux页表

    目的: 通过一个c语言实例,了解linux页表的组织结果和mmu的工作原理. 通过页表找到一个物理地址, 对比物理地址与虚拟地址的内容是否一致. 运行环境: $ uname -r3.15.6-200. ...