题目链接:gym-100952-C
题目大意:给出字符串a,将该字符串变成回文串
1.字符串向左边或右边移动一步(0往前移一格为n-1看成环),花费为1
2.当前字母变幻为相邻字母,例如a -> b 或 a -> z, 花费为1
题目思路:模拟
以下是代码:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <sstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <functional>
#include <numeric>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#include <deque>
#include <list>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n, p;
cin >> n >> p;
p--;
string s;
cin >> s;
int len = s.size();
int minpos = 999999, maxpos = 0;
int ans = 0;
int flag = 0;
for (int i = 0, j = len - 1; i < len / 2; i++, j--)
{
if (s[i] != s[j])
{
int a = min(s[i], s[j]) - 'a';
int b = max(s[i], s[j]) - 'a';
ans += min(b - a, a + 26 - b);
minpos = min(minpos, i);
maxpos = max(maxpos, i);
flag = 1;
}
}
if (!flag) //判断本身是否为回文串
{
cout << 0 << endl;
continue;
}
if (len % 2 && p == len / 2)
{
ans += abs(p - minpos);
cout << ans << endl;
continue;
}
if (p >= len / 2)
{
p = len - p - 1; //注意这里是对称,不能直接减len/2
}
int a = abs(minpos - p);
int b = abs(maxpos - p);
ans += min(a, b);
ans += maxpos - minpos;
cout << ans << endl;
}
return 0;
}