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),当某个项链可以构成回文时 ...
随机推荐
- QF——iOS沙盒机制
iOS沙盒机制: 什么是沙盒机制? 点击进入 点击进入 沙盒机制(SandBox)是一种安全体系,它规定了APP的所有文件数据都必须存储在这片区域.所有非代码文件的数据都保存在这片区域. 沙盒里有 ...
- php测试时不出现错误信息
来源:http://blog.sina.com.cn/s/blog_6c9d65a101013vdj.html 在练习程序时,有时候写错了,在浏览器会打印出出错信息. 可我的程序始终没有出现. 我的环 ...
- php的系统常量
认识一下系统常量 系统常量是PHP已经定义好的常量,我们可以直接拿来使用,常见的系统常量有: (1)__FILE__ :php程序文件名.它可以帮助我们获取当前文件在服务器的物理位置. (2)__LI ...
- php curl函数实例
<?php function login(){ $url = 'http://jspatch.qq.com/offline/check?qver=6.2.0.427&hver=0& ...
- Delphi COM编程技术三类型库(库文件中的工具栏,很全)
在COM组件的使用和开发过程中经常需要获取有关组件的信息.而COM组件以二进制代码的形式发布,如果不借助特定的工具这些相关信息将难以被获取.通过访问类型库就可以查看COM组件的信息. 一.类型库的基础 ...
- [笔记]线性回归&梯度下降
一.总述 线性回归算法属于监督学习的一种,主要用于模型为连续函数的数值预测. 过程总得来说就是初步建模后,通过训练集合确定模型参数,得到最终预测函数,此时输入自变量即可得到预测值. 二.基本过程 1. ...
- Spring MVC详细示例实战教程【转】
一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 ...
- Jsp连接Mysql数据库取数方法
我将Jsp连接Mysql数据库方法整理如下,供大家学习交流! 1.首先在myslq数据库中新建mldn数据库,并新建emp表.(方法不展开介绍) 插入数据如下: create table `emp` ...
- hdu3507
题意: 给n(n<=10^6)个非负数字,放在一个数组num中,再给一个特殊值m.求将这个数组分成任意多个区间,每个区间[a,b]的值定义为( sigma(num[i] | (a<=i&l ...
- BZOJ 4197: [Noi2015]寿司晚宴( dp )
N^0.5以内的质数只有8个, dp(i, j, k)表示用了前i个大质数(>N^0.5), 2人选的质数(<=N^0.5)集合分别为j, k时的方案数. 转移时考虑当前的大质数p是给哪个 ...