【题目链接】 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. leetcode Count and Say python

    class Solution(object): def countAndSay(self, n): """ :type n: int :rtype: str " ...

  2. (转载)JS中的prototype

    原文地址:http://www.cnblogs.com/yjf512/archive/2011/06/03/2071914.html#!comments JS中的phototype是JS中比较难理解的 ...

  3. MYSQL定时创建表分区

    MYSQL定时创建表分区 一.存储过程-表分区-----------------------------------------------------------------需求: 每月创建一个分区 ...

  4. Android textview 设置不同的字体大小和颜色

    在实际应用中,需要将一个字符串已不同的颜色,字体显示出来.当然完全可以通过不同textview拼接出来.也可以通过一个textview来展示. 步骤如下: 1.定义不同style . 不妨如下定义2个 ...

  5. wget www.baidu.com执行流程分析

    下载网页的关键函数: main.c(main) b 1394 url_parse:解析url,获取url相关信息,返回结构体 struct url 的指针,存于 url_parsed retrieve ...

  6. Linux 内核无线子系统

    Linux 内核无线子系统 浅谈 Linux 内核无线子系统 Table of Contents 1. 全局概览 2. 模块间接口 3. 数据路径与管理路径 4. 数据包是如何被发送? 5. 谈谈管理 ...

  7. 升级linux内核(2.6.32->3.10.81),安装docker

    1.内核升级环境准备 #查看已经安装的和未安装的软件包组,来判断我们是否安装了相应的开发环境和开发库: yum grouplist #一般是安装这两个软件包组,这样做会确定你拥有编译时所需的一切工具 ...

  8. (14)[Xamarin.Android] 异步的网络图片下载

    原文 [Xamarin.Android] 异步的网络图片下载 在设计要从网络上接大量数据并且显示在Android Listview中,而这些资料是利用Json格式传送并且数据中包含这图片档案. 那在X ...

  9. POJ 3111 K Best(最大化平均值)

    题目链接:click here~~ [题目大意]有n个物品的重量和价值各自是Wi和Vi.从中选出K个物品使得单位重量的价值最大,输出物品的编号 [解题思路]:最大化平均值的经典.參见click her ...

  10. ASP连接sql server实例解析

    1.首先确定自己的iis没有问题 2.其次确定自己sqlserver没有问题 然后在iis的文件夹wwwroot里,建立一个文件 名为testSqlServer.asp,编写代码例如以下就可以 < ...