持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第24天,点击查看活动详情。
题目信息
Charles 将一个字符串的优良分数定义为,在 1≤i≤N/21≤i≤N/2 的范围内,满足 Si≠SN−i+1Si≠SN−i+1 的 i 的数量(索引从 1 开始)。
例如,字符串 CABABC 的优良分数为 2,因为 S2≠S5S2≠S5 并且 S3≠S4S3≠S4。
Charles 给了 Ada 一个长度为 N 的由大写字母构成的字符串 S,并让她将其转换为一个优良分数为 K 的字符串。
每次操作,Ada 都可以将字符串中的任意一个字符转换为任意一个大写字母。
请你帮助 Ada 确定,将给定字符串 S 转换为优良分数为 K 的字符串,所需要的最少操作次数。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含两个整数 N 和 K。
第二行包含一个长度为 N 的由大写字母构成的字符串 S。
输出格式
每组数据输出一个结果,每个结果占一行。
结果表示为 Case #x: y,其中 x 为组别编号(从 1 开始),y 为所需最少操作次数。
数据范围
全部数据:1≤T≤1001≤T≤100,0≤K≤N/20≤K≤N/2。
测试点 11 (小数据测试点):1≤N≤1001≤N≤100。
测试点 22 (大数据测试点):最多不超过 10 组数据满足,1≤N≤2×105,其余数据满足,1≤N≤100。
输入样例:
2
5 1
ABCAA
4 2
ABAA
输出样例:
Case #1: 0
Case #2: 1
样例解释
对于测试数据 11,给定字符串的优良分数刚好为 11,所以不需要任何操作。
对于测试数据 22,将索引 11 处的字符改为 BB 即可。
思路
本题采用双指针算法,然后在减一下就可以得出本题的答案。
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t,k,n,m; //不需讲解
char c[200001];
cin>>t;//输入
for(int i=1;i<=t;i++){//循环到t
m=0;//记录
cin>>n>>k>>c+1;//输入
for(int i=1;i<=n/2;i++)//循环到n/2
if(c[i]!=c[n-i+1])//核心
m++;
printf("Case #%d: %d\n",i,abs(k-m));//输出k-m的绝对值
}
return 0;//完成
}