递推预处理 + Manacher
链接:https://www.nowcoder.com/acm/contest/131/D
来源:牛客网
删除字符串的第一个字母。
删除字符串的最后一个字母。
在字符串的头部添加任意一个你想要的字母。
在字符串的尾部添加任意一个你想要的字母。
删除一个第 i 种英文字母需要的花费是 Ai,添加一个第 i 种英文字母的花费是 Bi。
请问将字符串 S 变成回文串需要的最小花费是多少?
输入描述:
第一行输入一个字符串 S。
接下来 26 行,每行输入两个正整数 A
i
和 B
i
,表示删除一个第 i 种字符所需的花费以及添加一个第 i 种字符所需的花费。
1≤ |S| ≤ 10
5
且字符串 S 中只包含小写英文字母 1≤ A
i
,B
i
≤ 109.
输出描述:
输出一个正整数,表示把字符串 S 变成一个回文串的最小花费。
输入
jelly
1000 1100
350 700
200 800
2000 2000
2000 432
2000 2000
2000 2000
2000 2000
2000 2000
20 2000
2000 2000
350 35
200 800
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
2000 2000
15 2000
2000 2000
输出
105 题意 : 给你一个字符串,每次只能在两端操作,增加一个字符或删掉一个字符,将其变成最长回文串
思路分析:一个马拉车可以预处理处理以每个位置为中心开始的最长回文子串,然后接下来的操作就是将一侧全部去掉,另一侧选择性的补齐一部分即可,每次补齐操作都是针对到两个边界的区间的,因此可以直接预处理处理
代码示例:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn = 1e5+5; char s[maxn], now[maxn*2];
ll a[30], b[30];
ll len;
ll qa[maxn], qb[maxn], ha[maxn], hb[maxn];
ll qs[maxn], hs[maxn];
ll p[2*maxn]; void init() {
for(ll i = 1; i <= len; i++) qa[i] = qa[i-1]+a[s[i]-'a'];
for(ll i = 1; i <= len; i++) qb[i] = qb[i-1]+b[s[i]-'a']; for(ll i = len; i >= 1; i--) ha[i] = ha[i+1]+a[s[i]-'a'];
for(ll i = len; i >= 1; i--) hb[i] = hb[i+1]+b[s[i]-'a']; ll pos = 0; for(ll i = 1; i <= len; i++){
if (qa[i] < qa[pos]+qb[i]-qb[pos]){
pos = i;
qs[i] = qa[i];
}
else qs[i] = qa[pos]+qb[i]-qb[pos];
} pos = len+1;
for(ll i = len; i >= 1; i--){
if (ha[i] < ha[pos]+hb[i]-hb[pos]){
pos = i;
hs[i] = ha[i];
}
else hs[i] = ha[pos]+hb[i]-hb[pos];
}
} void Manacher()
{
for (ll i=1;i<=len;i++) now[2*i-1]='%',now[2*i]=s[i];
now[len=len*2+1]='%';
ll pos=0,R=0;
for (ll i=1;i<=len;i++)
{
if (i<R) p[i]=min(p[2*pos-i],R-i); else p[i]=1;
while (1<=i-p[i]&&i+p[i]<=len&&now[i-p[i]]==now[i+p[i]]) p[i]++;
if (i+p[i]>R) {pos=i;R=i+p[i];}
}
} int main () {
scanf("%s", s+1);
len = strlen(s+1); for(ll i = 0; i < 26; i++) scanf("%lld%lld", &a[i], &b[i]);
init();
Manacher(); ll ans = (1ll)<<60;
ll l, r;
for(ll i = 1; i <= len; i++){
p[i]--;
if (i%2){
ll ff = p[i]/2;
l = i/2-ff, r = i/2+ff+1;
}
else {
ll ff = p[i]/2;
l = i/2-ff-1, r = i/2+ff+1;
} ans = min(ans, qa[l]+hs[r]);
ans = min(ans, ha[r]+qs[l]);
//printf("%lld %lld %lld\n",l, r, ans);
}
printf("%lld\n", ans);
return 0;
}
递推预处理 + Manacher的更多相关文章
- Codeforces Round #271 (Div. 2) D. Flowers (递推 预处理)
We saw the little game Marmot made for Mole's lunch. Now it's Marmot's dinner time and, as we all kn ...
- HDU 4834 JZP Set(数论+递推)(2014年百度之星程序设计大赛 - 初赛(第二轮))
Problem Description 一个{1, ..., n}的子集S被称为JZP集,当且仅当对于任意S中的两个数x,y,若(x+y)/2为整数,那么(x+y)/2也属于S.例如,n=3,S={1 ...
- CodeForces 429 B Working out(递推dp)
题目连接:B. Working out 我想了很久都没有想到怎么递推,看了题解后试着自己写,结果第二组数据就 wa 了,后来才知道自己没有判选择的两条路径是否只是一个交点. 大概思路是:先预处理出每个 ...
- 【递推】【DFS】【枚举】Gym - 101246C - Explode 'Em All
网格里放了一些石块,一个炸弹能炸开其所在的行和列.问炸光石块至少要几个炸弹. 枚举不炸开的行数,则可以得出还要炸开几列. 为了不让复杂度爆炸,需要两个优化. 先是递推预处理出f(i)表示i的二进制位中 ...
- 利用Cayley-Hamilton theorem 优化矩阵线性递推
平时有关线性递推的题,很多都可以利用矩阵乘法来解决. 时间复杂度一般是O(K3logn)因此对矩阵的规模限制比较大. 下面介绍一种利用利用Cayley-Hamilton theorem加速矩阵乘法的方 ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- HDU-4651 Partition 整数拆分,递推
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:求n的整数拆为Σ i 的个数. 一般的递归做法,或者生成函数做法肯定会超时的... 然后要 ...
- 【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度
1002: [FJOI2007]轮状病毒 Description 给定n(N<=100),编程计算有多少个不同的n轮状病毒. Input 第一行有1个正整数n. Output 将编程计算出的不同 ...
- BZOJ4451 [Cerc2015]Frightful Formula 多项式 FFT 递推 组合数学
原文链接http://www.cnblogs.com/zhouzhendong/p/8820963.html 题目传送门 - BZOJ4451 题意 给你一个$n\times n$矩阵的第一行和第一列 ...
随机推荐
- MAMP "403 Forbidden You don't have permission to access / on this server."
2015年01月22日 17:27:31 阅读数:3488 用MAMP搭建本地服务器的时候,设置好ip和端口等属性之后,浏览器访问,报 403错误: Forbidden You don't have ...
- SpringSecurity登录原理(源码级讲解)
一.简单叙述 首先会进入UsernamePasswordAuthenticationFilter并且设置权限为null和是否授权为false,然后进入ProviderManager查找支持Userna ...
- 【codeforces 749B】Parallelogram is Back
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- vue移动端图片上传压缩
上传压缩方法 import {api} from '../../api/api.js'; import axios from 'axios'; export function imgPreview ( ...
- Oracle如何分组排序并产生序号
SELECT C.ORG_SHORTNAME, B.USER_NAME, ROW_NUMBER () OVER ( PARTITION BY B.ORG_ID ORDER BY A.TOTAL_SCO ...
- JNDI数据源的使用
有时候我们数据库的连接会使用jndi的方式 try { InitialContext ic = new InitialContext(); dataSource = (DataSource) ic.l ...
- Linux 2>&1的意思
2>&1的意思是将标准错误(2)也定向到标准输出(1)的输出文件中. 我们来具体了解下:Linux 中三种标准输入输出,分别是STDIN,STDOUT,STDERR,对应的数字是0,1, ...
- SQL Server内连接、左外连接、右外连接、完全连接、交叉lianjie
数据准备: create table T1( A ) not null, B ) not null, C tinyint not null ); create table T2( B ) not nu ...
- DEVOPS技术实践_05:sonar静态代码扫描
一.SonarQube静态代码扫描平台 1.1 安装 https://www.sonarqube.org/官网 1.2 下载软件包 https://www.sonarqube.org/download ...
- 如何利用腾讯云COS为静态博客添加动态相册
前言 本文首发于个人网站Jianger's Blog,欢迎访问订阅.个人博客小站刚建站不久,想着除了主题里的功能外再添加上相册模块,于是半搜索半摸索把相册模块搞出来了,最后采用了利用腾讯云对象存储作图 ...