算法题(K-优字符串)

100 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;//完成
}