大意:把一个字符串分成两串,假如一个字符串是回文串就可以加上它的VALUE,否则它的VALUE为0;

KMP的特点是可以求出前缀与后面的字符串是否匹配,

注意回文串的特点,所以当我们把回文串反转的时候会发现与前面的字符串匹配,

然后将字符串整个反转可以求出后缀的,

利用其特点可以快速判断回文串,

CODE;

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string.h>
#define N 500008
using namespace std;
typedef long long ll; char s[*N];
int next[*N];
int a[];
int sum[N*],pos[*N],pre[*N]; void get_next(char *s)//NEXT数组
{
next[]=-;
int k=-,i=;
int l=strlen(s);
while (i<l)
{
if (k==-||s[i]==s[k])
{
k++;i++;
next[i]=k;
}
else k=next[k];
}
} int main()
{
int cas;
scanf("%d",&cas); while (cas--)
{
memset(pos,,sizeof(pos));
memset(pre,,sizeof(pre));
for (int i=;i<;i++) scanf("%d",&a[i]);
scanf("%s",s); int len=strlen(s);
for (int i=;i<=len;i++) sum[i]=sum[i-]+a[s[i-]-'a'];//预先处理SUM数组,注意我们把A[I]的值移位了。
s[len]='#';
int k=len,l=len;
while (k) s[++l]=s[--k];//字符串反接在后面
s[++l]='\0';
get_next(s);
int dol=l;
while (next[dol]) {pre[next[dol]]=len+;dol=next[dol];}
for (int i=;i<len;i++)
swap(s[i],s[len++i]); get_next(s);
dol=l;
while (next[dol]) {pos[next[dol]]=len+;dol=next[dol];}; int ans=-;
for (int i=;i<len;i++)//核心代码,计算值
{
int ss=;
if (pre[i]==len+) ss+=sum[i];
if (pos[len-i]==len+) ss+=sum[len]-sum[i];
ans=max(ans,ss);
}
printf("%d\n",ans); }
return ;
}

KMP_Best Reward的更多相关文章

  1. ACM: hdu 2647 Reward -拓扑排序

    hdu 2647 Reward Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Des ...

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

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

  3. 回文串---Best Reward

    HDU   3613 Description After an uphill battle, General Li won a great victory. Now the head of state ...

  4. hdu 2647 Reward

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2647 Reward Description Dandelion's uncle is a boss o ...

  5. Reward

    Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  6. hdoj 2647 Reward【反向拓扑排序】

    Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  7. Reward HDU

    Reward                                    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32 ...

  8. Reward(拓扑结构+邻接表+队列)

    Reward Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submis ...

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

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

随机推荐

  1. Delphi用TActionList下载文件

    TActionList有个标准动作TDownLoadURL,内部是使用的URLDownloadToFile,它下载文件时会定时产生OnDownloadProgress 事件,这样就可以用进度条显示: ...

  2. JDBC基础一

    JDBC:java database connectivity SUN公司提供的一套操作数据库的标准规范. JDBC与数据库驱动的关系:接口与实现的关系. JDBC规范(掌握四个核心对象): Driv ...

  3. 从客户端检测到有潜在危险的Request.Form 值【转】

    asp.net开发中,经常遇到“从客户端检测到有潜在危险的Request.Form 值”错误提示,很多人给出的解决方案是: 1.web.config文档<system.web>后面加入这一 ...

  4. SymPy库常用函数

    简介 SymPy是一个符号计算的Python库.它的目标是成为一个全功能的计算机代数系统,同时保持代码简 洁.易于理解和扩展.它完全由Python写成,不依赖于外部库.SymPy支持符号计算.高精度计 ...

  5. 006-python基础-条件判断与循环

    一.条件判断 场景一.用户登陆验证 # 提示输入用户名和密码 # 验证用户名和密码 # 如果错误,则输出用户名或密码错误 # 如果成功,则输出 欢迎,XXX! #!/usr/bin/env pytho ...

  6. programming ruby

    ri #rdoc reader attr_reader attr_writer @@xx 类变量都是私有的 def 类名.xx end 类方法 [1,3,5,7].inject(0){|sum,e| ...

  7. Ruby on Rail学习笔记

    说明:只针对Windows8.1 Windows下,上rubyinstaller上下载最新的railsinstaller包含Ruby2.1的,然后更新gem 用命令: gem update --sys ...

  8. 菜鸟学习SSH——目录

    菜鸟学习Struts--配置Struts环境 菜鸟学习Struts--简易计算器 菜鸟学习Struts--bean标签库 菜鸟学习Struts--Scope属性 菜鸟学习Struts--国际化 菜鸟学 ...

  9. C#中的索引

    索引代码示例:                 索引的使用示例:                       索引在经过编译器编译之后就相当于一个属性,进一步的说就是两个方法.       一个类允许 ...

  10. [转]JSON与XML的区别比较

    1.定义介绍 (1).XML定义扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许 ...