【链接】 我是链接,点我呀:)
【题意】

光标一开始在p的位置
你可以用上下左右四个键位移动光标(左右)或者更改光标所在的字符(上下增加或减少ascill码)
问你最少要操作多少次才能使得字符串变成回文

【题解】

首先把字符串分成两个部分
1..n/2 和 n/2+1..n这两个部分 (如果n是奇数比较特殊,右半部分是n/2+2..n)
然后如果p落在右半部分那个区间的话
就让它做一下对称
到左半部分来
因为不可能从右边那个区间移动到左边那个区间的(跨越n到达1),那样做太不划算
这两个区间其实是等价的,因为转换的代价都是相同的
只需让光标在一个区间里面移动就好
然后我们就只要考虑一个区间了(1..n/2),
先算出来每个位置转换成回文串对应的位置的字符需要的代价cost[i]
然后求一个前缀和(我直接在cost[i]上求的前缀和,直接导致我忘记cost[i]代表的是cost[1..i]。。。。)
然后再把这一个区间分成(1..p-1)和(p+1,n/2)
我们用前缀和求出cost[1..p-1]和cost[p+1,n/2]
这一部分答案是肯定要累加的。
然后我们只要知道我们往左和往右走最近需要走到哪里(因为不一定非得走到1或者走到n/2)
记往左走最少需要走的步数为leftstep,同理向右为rightstep
(如果不用往左走或不用往右走那么对于的xxxstep=0)
那边要的步数少,我们就先走到那边
因为这样的话,回到p位置所需要的花费比较少
则答案累加min(leftstep,rightstep)*2+max(leftstep,rightstep)
这样就做完了!

【代码】

import java.io.*;
import java.util.*;public class Main {static InputReader in;static PrintWriter out;public static void main(String[] args) throws IOException{//InputStream ins = new FileInputStream("E:\\rush.txt");InputStream ins = System.in;in = new InputReader(ins);out = new PrintWriter(System.out);//code start from herenew Task().solve(in, out);out.close();}static int N = 50000;static class Task{final int N = (int)1e5; String s;int n,p;int cost[];int get_sum(int l,int r) {if (l>r) return 0;return cost[r]-cost[l-1];}public void solve(InputReader in,PrintWriter out) {cost = new int[N+10];n = in.nextInt();p = in.nextInt();s = in.next();StringBuilder sb = new StringBuilder(s);sb.insert(0, ' ');s = sb.toString();int half = n/2;for (int i = 1;i <= half;i++) {int j = n-i+1;int x = s.charAt(i)-'a'+1;int y = s.charAt(j)-'a'+1;int temp1 = Math.abs(x-y);int temp2 = 26-Math.max(x, y) + Math.min(x, y) - 1 + 1;cost[i] = Math.min(temp1, temp2);}for (int i = 1;i <= half;i++) cost[i]+=cost[i-1];if (cost[half]==0) {out.println(0);return;}int ans = 0;if (n%2==1 && p==half+1) {ans++;p--;}if (p>half) {int delta;if (n%2==1) {delta = p-(half+1);p = half+1-delta;}else {delta = p-half;p = half-delta+1;}}ans = ans + get_sum(p,p);int leftcost = get_sum(1,p-1);int rightcost = get_sum(p+1,half);ans = ans + leftcost + rightcost;int leftstep = 0,rightstep = 0;int temp = 0;for (int i = p-1;i >= 1;i--) {if (temp==leftcost) break;leftstep++;temp+=get_sum(i,i);}temp = 0;for (int i = p+1;i <= half;i++) {if (temp==rightcost) break;rightstep++;temp+=get_sum(i,i);}//out.println("leftstep="+leftstep+" rightstep="+rightstep);//out.println("leftcost="+leftcost+" rightcost="+rightcost);//out.println("ans="+ans);int mi = Math.min(leftstep, rightstep);int ma = Math.max(leftstep, rightstep);ans = ans + mi*2 + ma;out.println(ans);}}static class InputReader{public BufferedReader br;public StringTokenizer tokenizer;public InputReader(InputStream ins) {br = new BufferedReader(new InputStreamReader(ins));tokenizer = null;}public String next(){while (tokenizer==null || !tokenizer.hasMoreTokens()) {try {tokenizer = new StringTokenizer(br.readLine());}catch(IOException e) {throw new RuntimeException(e);}}return tokenizer.nextToken();}public int nextInt() {return Integer.parseInt(next());}}
}

转载于:https://www.cnblogs.com/AWCXV/p/10427543.html

【Codeforces 486C】Palindrome Transformation相关推荐

  1. *【CodeForces - 122D】Lucky Transformation(字符串问题,思维剪枝,优化,有坑,需注意的问题if的层次总结)

    题干: Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers whose decima ...

  2. 【CodeForces - 144C】Anagram Search(尺取,滑窗问题,处理字符串计数)

    题干: A string t is called an anagram of the string s, if it is possible to rearrange letters in t so ...

  3. 【CodeForces - 574B】Bear and Three Musketeers (枚举边,思维,优秀暴力)

    题干: Do you know a story about the three musketeers? Anyway, you will learn about its origins now. Ri ...

  4. 【CodeForces - 608C】Chain Reaction (二分 或 dp ,思维)

    题干: 题目大意: 题意是在一条直线上坐落着不同位置的灯塔,每一个灯塔有自己的power level,当作是射程范围.现在从最右边的灯塔开始激发,如果左边的灯塔在这个灯塔的范围之内,那么将会被毁灭.否 ...

  5. 「一题多解」【CodeForces 85D】Sum of Medians(线段树 / 分块)

    题目链接 [CodeForces 85D]Sum of Medians 题目大意 实现一个setsetset,支持插入,删除,求∑a5k+3∑a5k+3\sum a_{5k+3}.注意,setsets ...

  6. 【CodeForces 997C】Sky Full of Stars(组合计数)

    题目链接:[CodeForces 997C]Sky Full of Stars 官方题解:Codeforces Round #493 - Editorial 题目大意:有一个n×nn×nn\times ...

  7. 【codeforces 798A】Mike and palindrome

    [题目链接]:http://codeforces.com/contest/798/problem/A [题意] 让你严格改变一个字符,使得改变后的字符串为一个回文串; 让你输出可不可能; [题解] 直 ...

  8. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  9. 【codeforces 508B】Anton and currency you all know

    [题目链接]:http://codeforces.com/contest/508/problem/B [题意] 给你一个奇数; 让你交换一次数字; 使得这个数字变成偶数; 要求偶数要最大; [题解] ...

最新文章

  1. linux 报错 E: 无法定位软件包 python-lzma
  2. 关于布地奈德的副作用
  3. yml eureka defaultzone 只生效第一个_SpringCloud基础教程(三)-Eureka进阶
  4. [蓝桥杯2019初赛]不同子串-substr,模拟
  5. 图论 —— 带花树算法
  6. 汕头创易计算机科技,汕头文创设计下一个“爆款”在哪?汕大优秀毕业生分享创作心得...
  7. 电脑远程服务_电脑远程维修专家在线服务
  8. 求众数leetcode(169)+投票算法
  9. c#定时器Timer
  10. python dataset用法_dataset 用法(2)
  11. FFmpeg-Python 给视频添加文字
  12. 出中的意思是什么_从里出来是什么意思
  13. 计算机自动开机什么愿意,电脑自动开关机是什么原因 怎么解决呢
  14. C# Winform鼠标样式设置方法
  15. linux更改ntfs格式权限,Gentoo Linux下读写NTFS格式分区(ntfs-3g解决NTFS只读不可写的问题)...
  16. Shop项目后台--4.所有订单的订单详情/admin/order/list.jsp
  17. 【音视频】常见问题整理 - 技术提升1.0
  18. word表格怎么缩小上下间距_word,20XX,怎么调整表格上下距离
  19. 拒绝服务攻击过程详解
  20. c#开发wps插件(3)部署

热门文章

  1. mysql 8.0 yum_CentOS7使用yum安装MySQL8.0
  2. JAVA入门→下载安装编译执行、变量、数据类型
  3. 应用系统运行监控界面_重庆悦来会展二期电力监控系统的设计与应用
  4. Python入门--字符串的分割操作,split,rsplit
  5. 可下拉选项可模糊查询的文本输入框
  6. bzoj 3611: [Heoi2014]大工程(虚树+树形DP)
  7. bzoj 1042: [HAOI2008]硬币购物(dp+容斥)
  8. matlab 简单的图像填充例子
  9. opencv python 实现灰度图像和彩色图像直方图全局均衡化和自适应均衡化
  10. canal 增量订阅mysql消息