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 ...
随机推荐
- jquery 中获取URL参数的方法
今天写项目需要获取url后面的参数ref参数来判断是否开启计时器来刷新页面,之前一直都是用JS写的,今天在查资料的时候看到了一款JQ的插件 项目地址:https://github.com/allmar ...
- 软件下载网(包括MAC软件大全)
http://www.ddooo.com/ MAC软件大全: http://www.ddooo.com/apple/15_5_1.htm
- [WCF]WCF起航
解决方案概览: Client:windows 控制台应用程序. WcfService1: windows 服务应用程序. WCFWebTest:asp.net 空web应用程序. 变量程序命名.结构可 ...
- git clone cm source & cm vs android version
$ git clone https://github.com/CyanogenMod/android_packages_apps_DeskClock.git -b cm-9.0.0 CM4代表(And ...
- Swift - 初始化方法返回nil表示初始化失败
自Swift1.1开始,初始化init方法便有返回nil的能力.我们可以在init声明的时候在其后面加上一个 ? 或者 ! 来表示初始化失败时可能返回nil. 比如,给Int类添加一个将字符串初始化成 ...
- sql server日期字段值的比较
sql server中对日期字段值的比较 sql server中对日期字段的比较方式有多种,介绍几种常用的方式:用northwind库中的employees表作为用例表.1.between...and ...
- MFC为应用程序添加托盘(右键托盘,弹出菜单)
源代码:http://download.csdn.net/detail/nuptboyzhb/4137784 1. 导入一个托盘图标的资源(.ico)格式:资源ID为IDI_ICON1 2 ...
- [每日一题] OCP1z0-047 :2013-08-28 DELETE..........................................................160
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/10475707 正确答案:ACD 根据题库,操作如下: A答案能删除: oe@OCM> ...
- 网页 css
css---- 层叠样式表(Cascading Style Sheet) 一,层叠样式表的分类 1,外部样式表:在外部定义样式表,然后在页面head里面附加该样式表 2,内嵌样式表:直接在网页head ...
- [置顶] Jsp中的table多表头导出excel文件
首先引入两份JS:copyhtmltoexcel.js以及 tableToExcel.js /* * 默认转换实现函数,如果需要其他功能,需自行扩展 * 参数: * tableID : HTML中Ta ...