Gym 100952C&&2015 HIAST Collegiate Programming Contest C. Palindrome Again !!【字符串,模拟】
C. Palindrome Again !!
time limit per test:1 second
memory limit per test:64 megabytes
input:standard input
output:standard output
Given string with N characters, your task is to transform it to a palindrome string. It's not as easy as you may think because there is a cost for this transformation!!
First you have to start from character at given position P. From your position you always have 2 options:
- You can move one step to the right or to the left, the cost of each movement is 1. Assume that the string is cyclic, this means if you move one step to the left you will be at position P-1 if P > 1 or at the last character if P = 1, and if you move one step to the right you will be at position P+1 if P < N or at first character if P = N.
- You can change the letter at your current position by replacing it with the next or previous one in the English alphabet (assume that the alphabet is also cyclic so ‘a’ is after ‘z’). The cost of each replacement is also 1.
You should repeat that until the transformation is finished and the string is palindrome. What is the minimum cost to do that?
Input
The first line contains the number of test cases T ( 1 ≤ T ≤ 100 ). Each test case contains 2 lines, the first line contains two integers ( 1 ≤ N ≤ 100,000) the length of string and ( 1 ≤ P ≤ N ) the initial position. While the second line contains a string with exactly N alphabetical characters.
Output
For each test case output one line contains the minimum cost that is needed to change the string into a palindrome one.
Examples
Input
1
8 3
aeabdaey
Output
8
Note
start with P = 3 ae(a)bdaey, move right => aea(b)daey, change to next => aea(c)daey, change to next => aea(d)deay, move left => ae(a)ddeay, move left => a(e)addeay, move left => (a)eaddeay, change to previous => (z)eaddeay, change to previous => (y)eaddeay. This costs 8 (4 movements and 4 replacements)
题目链接:http://codeforces.com/gym/100952/problem/C
题目大意:给出字符串a,将该字符串变成回文串!
分析:
字符串向左边或右边移动一步(0往前移一格为n-1看成环),花费为1
当前字母变为相邻字母,例如a -> b 或 a -> z, 花费为1
模拟此过程操作即可,代码给出了详细注释,一看就懂了!
下面给出AC代码:
1 #include <bits/stdc++.h>
2 using namespace std;
3 inline int read()
4 {
5 int x=0,f=1;
6 char ch=getchar();
7 while(ch<'0'||ch>'9')
8 {
9 if(ch=='-')
10 f=-1;
11 ch=getchar();
12 }
13 while(ch>='0'&&ch<='9')
14 {
15 x=x*10+ch-'0';
16 ch=getchar();
17 }
18 return x*f;
19 }
20 inline void write(int x)
21 {
22 if(x<0)
23 {
24 putchar('-');
25 x=-x;
26 }
27 if(x>9)
28 write(x/10);
29 putchar(x%10+'0');
30 }
31 int main()
32 {
33 int t;
34 t=read();
35 while(t--)
36 {
37 int len,p;
38 len=read();
39 p=read();
40 p--;//从零下标开始计数
41 string s;
42 cin>>s;
43 //移动距离
44 int minn=1e+8;
45 int maxn=-1e+8;
46 int ans=0,flag=0;
47 for(int i=0,j=len-1;i<len/2;i++,j--)
48 {
49 if(s[i]!=s[j])
50 {
51 int a=min(s[i],s[j])-'a';
52 int b=max(s[i],s[j])-'a';
53 ans+=min(b-a,a+26-b);//变换需要移动的最短距离
54 minn=min(minn,i);//满足条件最近的下标值
55 maxn=max(maxn,i);//满足条件最远的下标值
56 flag=1;
57 }
58 }
59 if(!flag)//如果序列已经是回文序列
60 {
61 printf("0n");
62 continue;
63 }
64 if(len%2==1&&p==len/2)//奇数长度的回文序列,查找下标刚好是其中点时
65 {
66 ans+=abs(p-minn);//移动距离为其长度的一半
67 printf("%dn",ans);
68 continue;
69 }
70 if(p>=len/2)
71 p=len-p-1;//这是一个回文序列,是对称的,所以我们采取序列号从小往大的排列方式
72 int c=abs(minn-p);
73 int d=abs(maxn-p);
74 ans+=min(c,d);//在变换过程中会忽略那些对称的点,所以这步是要加上那些忽略点的距离
75 ans+=(maxn-minn);//起始变换点与变换终点的距离,也就是移动距离
76 printf("%dn",ans);
77 }
78 return 0;
79 }
- 用TensorFlow实现文本分析模型,做个聊天机器人
- 深度学习:用tensorflow建立线性回归模型
- 用python基于2015-2016年的NBA常规赛及季后赛的统计数据分析
- 数值信息的机器级存储
- ABAP和Java里关于DEFAULT(默认)机制的一些语言特性
- Golang语言社区--golang 进度下载文件
- Golang语言社区--Go语言基础第七节函数调用等
- Hyperledger也能实现Token代币
- 经典Java面试题收集(二)
- 关于表联结方法(一)(r3笔记第57天)
- Go 语言读写 Excel 文档
- 关于索引的使用模式(r3笔记56天)
- 关于oracle中的半连接(r3笔记55天)
- 关于正则表达式第三篇(r3笔记第52天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法