HDU 3613 Best Reward(扩展KMP)
【题目链接】 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)的更多相关文章
- HDU 3613 Best Reward(扩展KMP求前后缀回文串)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...
- HDU 3613 Best Reward ( 拓展KMP求回文串 || Manacher )
题意 : 给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串,那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果不是回文串,那么这串价值就为0.问 ...
- HDU 3613 Best Reward 正反两次扩展KMP
题目来源:HDU 3613 Best Reward 题意:每一个字母相应一个权值 将给你的字符串分成两部分 假设一部分是回文 这部分的值就是每一个字母的权值之和 求一种分法使得2部分的和最大 思路:考 ...
- 扩展KMP --- HDU 3613 Best Reward
Best Reward Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...
- HDU - 3613 Best Reward(manacher或拓展kmp)
传送门:HDU - 3613 题意:给出26个字母的价值,然后给你一个字符串,把它分成两个字符串,字符串是回文串才算价值,求价值最大是多少. 题解:这个题可以用马拉车,也可以用拓展kmp. ①Mana ...
- hdu3613 Best Reward 扩展kmp or O(n)求最大回文子串
/** 题目:hdu3613 Best Reward 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题意:有一个字符串,把他切成两部分. 如果这部 ...
- HDU 4333 Revolving Digits 扩展KMP
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意:给以数字字符串,移动最后若干位到最前边,统计得到的数字有多少比原来大,有多少和原来同样,有多少 ...
- S - Best Reward 扩展KMP
After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...
- HDU 4333 Revolving Digits [扩展KMP]【学习笔记】
题意:给一个数字,每一次把它的最后一位拿到最前面,一直那样下去,分别求形成的数字小于,等于和大于原来数的个数. SAM乱搞失败 当然要先变SS了 然后考虑每个后缀前长为n个字符,把它跟S比较就行了 如 ...
- hdu 3613"Best Reward"(Manacher算法)
传送门 题意: 国王为了犒劳立下战功的大将军Li,决定奖给Li一串项链,这个项链一共包含26中珠子"a~z",每种珠子都有 相应的价值(-100~100),当某个项链可以构成回文时 ...
随机推荐
- 使用ajax异步提交表单
虽然这篇文章的标题是提交表单,但是主要的难点在于使用ajax提交文本域的内容, 在工作中的经常会需要ajax跨域的问题,通常的需求使用jsonp就可以得到解决,但是当前项目中有一个图片服务器,客户端需 ...
- ODI利用goldengate实现增量数据捕获
ODI利用goldengate实现增量数据捕获 上个月,Oracle发布了ODI的最新版本10.1.3.6_02,其中增加了针对采用goldengate获取源数据库增量变化的知识模块,这样当系统需要实 ...
- 如何使用win7自带的备份还原以及创建系统镜像------傻瓜式教程
对于经常鼓捣电脑的童鞋来说,装系统是一件极其平常的事情,不过系统装多了之后,我们会感到比较烦躁,因为每一次装系统意味着驱动的重新安装,程序的重新安装,每次这么鼓捣几次,半天时间就花在这上面了,效率是在 ...
- 《windows程序设计》学习_4:文本输出,加滚动条
//总行数 #define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0])) struct { int Index ; TCHA ...
- ajax、form提交乱码
ajax 传参乱码:encodeURI(encodeURI(username)) form 传参乱码:request.setCharacterEncoding("UTF-8"); ...
- [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(五)
目的: 1. 了解PCI的基本知识,为完成watchdog的设备做准备. 准备知识: 简单的说,PCI 设备分3个空间. 配置空间,IO空间,内存地址空间. PCI设备厂家决定了外设是使用IO空间还是 ...
- iso-开发基础知识-1-程序流程
main-应用程序委托-视图控制器 main()---主函数 应用程序委托 ---AppDelegate 视图控制器 ---ViewController - (BOOL)applicatio ...
- 汉诺塔VII(递推,模拟)
汉诺塔VII Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- 值得赞扬的尝试与进步——CSDN开源夏令营第一印象
注:写这篇文章时我并未參加CSDN开源夏令营,也不确定是否会參加以及是否能參加上. 欣闻CSDN举办了"CSDN开源夏令营"活动.第一感觉是CSDN作为活动的组织者是很值得称赞的. ...
- VBA 开发学习--基础语法
MsgBox "开始学习VBA" '提示框 Dim str As String '声明str变量是string类型 Let str = "一起来看流星雨" '给 ...