HDU 3613 Best Reward 正反两次扩展KMP
题目来源:HDU 3613 Best Reward
题意:每一个字母相应一个权值 将给你的字符串分成两部分 假设一部分是回文 这部分的值就是每一个字母的权值之和 求一种分法使得2部分的和最大
思路:考虑扩展KMP 输出a串 得到a的反串b 求出f[0]和f[1] 和 extend[0]和extend[1] 正反求2次
枚举位置i 分成2部分0到i-1 和i到n-1 由于分成的2部分必须组成原字符串 就是不能多也不能少
那么推断i+extend[i]是否等于n 等于说明i到n-1这个部分是回文串 sum1 为这部分的值 假设这部分不是回文sum1 = 0
推断0到i-1是不是回文 将a和b翻转 那么就和推断i到n-1是一样的 所以上面正反求了2次 sum2 为这部分的值 假设这部分不是回文sum2 = 0
去sum1+sum2的最大值 另外字符串的值能够递推求得
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 500010;
int f[2][maxn], ex[2][maxn];
char a[maxn], b[maxn];
int id[26], dp[2][maxn];
void getFail(char* s, int id, int n)
{
int k = 1, p = 0;
while(p+1 < n && s[p] == s[p+1])
p++;
f[id][0] = n;
f[id][1] = p;
for(int i = 2; i < n; i++)
{
int l = f[id][i-k];
int p = f[id][k]+k-1;
if(i+l-1 < p)
f[id][i] = l;
else
{
int j = p-i+1;
if(j < 0)
j = 0;
while(i+j < n && s[i+j] == s[j])
j++;
f[id][i] = j;
k = i;
}
}
} void getEx(char* s, char* t, int id, int n)
{
int k = 0, p = 0;
while(p < n && s[p] == t[p])
p++;
ex[id][0] = p;
for(int i = 1; i < n; i++)
{
int l = f[id^1][i-k];
int p = ex[id][k]+k-1;
if(i+l-1 < p)
ex[id][i] = l;
else
{
int j = p-i+1;
if(j < 0)
j = 0;
while(i+j < n && s[i+j] == t[j])
j++;
ex[id][i] = j;
k = i;
}
}
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
for(int i = 0; i < 26; i++)
scanf("%d", &id[i]);
scanf("%s", a);
int n = strlen(a); for(int i = 0; i < n; i++)
{
b[i] = a[n-i-1];
if(i)
dp[0][i] = id[a[i]-'a'] + dp[0][i-1];
else
dp[0][i] = id[a[i]-'a'];
}
for(int i = 0; i < n; i++)
{
if(i)
dp[1][i] = dp[1][i-1] + id[b[i]-'a'];
else
dp[1][i] = id[b[i]-'a'];
}
getFail(a, 0, n);
getFail(b, 1, n);
getEx(a, b, 0, n);
getEx(b, a, 1, n);
int ans = 0;
for(int i = 1; i < n; i++)
{
int sum1 = 0, sum2 = 0;
if(i+ex[0][i] == n)
sum1 = dp[1][ex[0][i]-1];
int j = n-i;
if(j+ex[1][j] == n)
sum2 = dp[0][ex[1][j]-1];
ans = max(ans, sum1+sum2);
//printf("%d %d\n", ex[0][i], ex[1][i]);
}
printf("%d\n", ans);
}
return 0;
}
HDU 3613 Best Reward 正反两次扩展KMP的更多相关文章
- HDU - 3613 Best Reward(manacher或拓展kmp)
传送门:HDU - 3613 题意:给出26个字母的价值,然后给你一个字符串,把它分成两个字符串,字符串是回文串才算价值,求价值最大是多少. 题解:这个题可以用马拉车,也可以用拓展kmp. ①Mana ...
- 扩展KMP --- HDU 3613 Best Reward
Best Reward Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...
- HDU 3613 Best Reward(扩展KMP求前后缀回文串)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...
- hdu 3613"Best Reward"(Manacher算法)
传送门 题意: 国王为了犒劳立下战功的大将军Li,决定奖给Li一串项链,这个项链一共包含26中珠子"a~z",每种珠子都有 相应的价值(-100~100),当某个项链可以构成回文时 ...
- HDU 3613 Best Reward(扩展KMP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3613 [题目大意] 一个字符串的价值定义为,当它是一个回文串的时候,价值为每个字符的价值的和,如果 ...
- HDU 3613 Best Reward(manacher求前、后缀回文串)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 题目大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分 ...
- 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
After an uphill battle, General Li won a great victory. Now the head of state decide to reward him w ...
- hdu 3613 Best Reward (manachar算法)
Best Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Prob ...
随机推荐
- 简单区分`:before`与`::before`的区别
简单区分:before与::before的区别 :hover我们都知道,称作伪类,英文名pseudo-class,而我们此处提到的:before以及:after也是伪类,属于css2的内容,在ie8下 ...
- 动态绑定Gridview带模板列
公司要做一个可以支持4种数据库(<!--数据库类型 (DLL专用) (SQL SERVER) (ORACLE) (ACCESS)(POSTGRE SQL)-->)的并且字段随表字段变化的可 ...
- Github-Client(ANDROID)开源之旅(四) ------ 简介Roboguice
Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC),Guice非常小而且快.Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数 ...
- SharePoint2010 部署步骤“激活功能”中出现错误:无法启动计算机“PCName”上的服务SPUserCodeV4
在SharePoint2010开发中,选择部署类型为“部署为沙盒解决方案”,在部署代码是出现如下错误提示: 部署步骤“激活功能”中出现错误:无法启动计算机“PCName”上的服务SPUserCodeV ...
- Eclipse更改默认工作目录的方法
参考: Eclipse更改默认工作目录的方法:http://blog.163.com/take_make/blog/static/208212210201272611406227/ 用记事本打开&qu ...
- 【Android】 -- 使用UncaughtExceptionHandler捕捉全局异常
在综合统计SDK(欧盟统计局的朋友,百度统计)之后.有一个非常有利的功能测试:错误分析.此功能可以在程序的执行中遇到崩溃(runtimeException)反馈给server,帮助开发者提高产品.多功 ...
- Swift - 系统声音服务的使用(播放声音,提醒,震动)
1,系统声音服务介绍: 系统声音服务提供了一个Api,用于播放不超过30秒的声音.它支持的文件格式有限,具体的说只有CAF.AIF和使用PCM或IMA/ADPCM数据的WAV文件. 但此函数没有提供操 ...
- 通过无线连接的方式来做 Appium 自动化
感谢TesterHome里各种大牛,提出的宝贵思路,我这里只是将他们的想法综合了一下,试出来的成果,谢谢大家分享你们的智慧. 简单说下背景: 由于公司要测试APP 产品的耗电问题,我们采取的办法很lo ...
- redis+tomcat共享session问题(转)
为了让楼主看看Java开发是多么的简单和轻松,你说你耗时一周都没搞好,简直就是胡说八道!!我从没搞过reids和tomcat整合的(我做的项目一直都是去session用cookie,为了验证你在胡说八 ...
- 基于visual Studio2013解决面试题之0205查找路径
题目