hdu 3613 Best Reward (manachar算法)
Best Reward
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
One of these treasures is a necklace made up of 26 different kinds of gemstones, and the length of the necklace is n. (That is to say: n gemstones are stringed together to constitute this necklace, and each of these gemstones belongs to only one of the 26 kinds.)
In accordance with the classical view, a necklace is valuable if and only if it is a palindrome - the necklace looks the same in either direction. However, the necklace we mentioned above may not a palindrome at the beginning. So the head of state decide to cut the necklace into two part, and then give both of them to General Li.
All gemstones of the same kind has the same value (may be positive or negative because of their quality - some kinds are beautiful while some others may looks just like normal stones). A necklace that is palindrom has value equal to the sum of its gemstones' value. while a necklace that is not palindrom has value zero.
Now the problem is: how to cut the given necklace so that the sum of the two necklaces's value is greatest. Output this value.
For each test case, the first line is 26 integers: v1, v2, ..., v26 (-100 ≤ vi ≤ 100, 1 ≤ i ≤ 26), represent the value of gemstones of each kind.
The second line of each test case is a string made up of charactor 'a' to 'z'. representing the necklace. Different charactor representing different kinds of gemstones, and the value of 'a' is v1, the value of 'b' is v2, ..., and so on. The length of the string is no more than 500000.
题目大意:
有一个由26种宝石组成的项链,给定每一种宝石的的价值,现需要将这串项链分成两部分
如果分开的项链是一个回文的则它的价值为之一部分项链上所有宝石价值的总和,否则的话它的价值为0
求能够得到的最大价值是多少。
解题思路:
先算出这串项链的价值前缀和,然后用manachar算法求出项链的p数组,根据p数组枚举切割点,从而求得最大价值。
manachar算法的具体讲解参考:http://www.cnblogs.com/yoke/p/6938193.html
AC代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; const int N = ;
char s[N*]; // 项链
int val[], p[N*], sum[N]; // val存每种宝石的价值 sum存项链的价值前缀和(前i个字符价值和)
int pre[N], pos[N]; // pre标记前i个字符为回文串 pos标记后i个字符为回文串
int manachar ()
{
memset(pos,,sizeof(pos));
memset(pre,,sizeof(pre));
memset(sum,,sizeof(sum));
int i, j = ;
int len = strlen(s);
for (i = ; i <= len; i ++) // 求项链价值的前缀和
sum[i] += sum[i-]+val[s[i-]-'a']; for (i = len; i >= ; i --) // 预处理项链字符串
{
s[i*+] = s[i];
s[i*+] = '#';
}s[] = '@';
// puts(s); int id = , mx = ;
for (i = ; s[i]; i ++)
{
p[i] = i<mx? min(p[id*-i],mx-i) : ;
while (s[i+p[i]] == s[i-p[i]]) p[i] ++;
if (i+p[i] > mx){
id = i;
mx = i + p[i];
}
if (i == p[i]) pre[p[i]-] = ; //表示前缀(前p[i]-1个字符)是回文串
if (i+p[i] == *len+) pos[p[i]-] = ; //表示后缀(后p[i]-1个字符)是回文串
}
int ans = -0x3f3f3f3f;
for (i = ; i < len; i ++) // 不断枚举切割点 求最大价值
{
j = ;
if (pre[i]) j += sum[i];
if (pos[len-i]) j += sum[len]-sum[i];
if (j > ans) ans = j;
}
return ans;
}
int main ()
{
int t,i;
scanf("%d",&t);
while (t --)
{
for (i = ; i < ; i ++)
scanf("%d",&val[i]);
scanf("%s",s);
int ans = manachar();
printf("%d\n",ans);
}
return ;
}
hdu 3613 Best Reward (manachar算法)的更多相关文章
- hdu 3613"Best Reward"(Manacher算法)
传送门 题意: 国王为了犒劳立下战功的大将军Li,决定奖给Li一串项链,这个项链一共包含26中珠子"a~z",每种珠子都有 相应的价值(-100~100),当某个项链可以构成回文时 ...
- HDU 3613 Best Reward(KMP算法求解一个串的前、后缀回文串标记数组)
题目链接: https://cn.vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. ...
- HDU 3613 Best Reward 正反两次扩展KMP
题目来源:HDU 3613 Best Reward 题意:每一个字母相应一个权值 将给你的字符串分成两部分 假设一部分是回文 这部分的值就是每一个字母的权值之和 求一种分法使得2部分的和最大 思路:考 ...
- HDU - 3613 Best Reward(manacher或拓展kmp)
传送门:HDU - 3613 题意:给出26个字母的价值,然后给你一个字符串,把它分成两个字符串,字符串是回文串才算价值,求价值最大是多少. 题解:这个题可以用马拉车,也可以用拓展kmp. ①Mana ...
- HDU 3613 Best Reward(拓展KMP算法求解)
题目链接: https://cn.vjudge.net/problem/HDU-3613 After an uphill battle, General Li won a great victory. ...
- 扩展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求前、后缀回文串)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 题目大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分 ...
- HDU 3613 Best Reward(扩展KMP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3613 [题目大意] 一个字符串的价值定义为,当它是一个回文串的时候,价值为每个字符的价值的和,如果 ...
- HDU 3613 Best Reward(扩展KMP求前后缀回文串)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...
随机推荐
- 在eclips中配置maven
可参考https://jingyan.baidu.com/article/59703552cb9b988fc00740a4.html
- PIE SDK影像坏线修复
1.算法功能简介 坏条带的由来:2003年5月31日,Landsat-7ETM+机载扫描行校正器(SLC) 故障,导致此后获取的影像出现了数据条带丢失,严重影响了Landsat ETM遥感影像的使用. ...
- Canvas 同心圆旋转示例解析
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Form Authentication
1.创建登陆的控制器和视图,实现登陆基本功能 2.创建视图模型,并在Action里面引用. 3.创建一个接口两个类,那个IUserPricipal接口要实现IPrincipal接口,UserPrici ...
- pandas数据清洗
1.我已安装好Anavonda3.5.所以我只用打开"jupyter notebook",然后打开浏览器 然后点击右侧的“new",然后打开python3
- gcc 常用命令
gcc编译器 $ gcc -o XX.exe XXX.c ddd.c $ gcc -o XX.asm -S XXX.c 编译生成可执行文件,并执行程序,缺省的时候,gcc 编译出来的文件是a.out ...
- 卸载Windows,安装纯Linux
操作步骤 下载安装一键GHOST优盘版 参考帮助文档,安装U盘启动 重启电脑,F12进入模式选择界面,选择USB device 选择DOS 工具 进入Disk Genius 删除掉除主分区(0)外的其 ...
- react&webpack使用css、less && 安装原则 --- 从根本上解决问题。
在webpack-react项目中,css的使用对于不同人有不同的选择,早起是推荐在jsx文件中使用 css inline js的,但是这种方法要写很多对象来表示一个一个的标签,并且对于这些对象,我们 ...
- Express4.10.2开发框架中默认app.js的代码注释
//通过require()加载了express.path等模块var express = require('express');var path = require('path');var favic ...
- 在Eclipse添加Android兼容包( v4、v7 appcompat )[转]
昨天添加Android兼容包,碰到了很多问题,在这里记录一下,让后面的路好走. 如何选择兼容包, 请参考Android Support Library Features(二) 一.下载Support ...