codeforces 1332C - K-Complete Word (回文,频次贪心)

本文介绍了一种优化算法,用于将任意字符串转换为K完美的字符串,即满足回文且具有固定周期性的字符串。通过统计字符频率并选择最频繁字符填充,以最小化修改次数。

题目大意:

现在我们称一个字符串str满足以下两个条件为k完美的。

(1)str是回文串

(2)str中的字符串以k为周期

现在我们有一个字符串s,问我们怎么改变最少的字符使得这个字符串为k完美的。

解题思路:

首先,我们发现满足这两个特征的字符串必定是每k个字符都是回文串。所以我们构造的字符串只要满足这个条件就好了。那么剩下的我们统计相对应位置的字母频次,让字母多的那个作为本个回文串中的字母。大概意思就是统计:

假设我们统计的是k=4的情况,那么黑色箭头为需要统计频次的地方。红色箭头为下一次需要统计字母频次的地方。

#include <bits/stdc++.h>
using namespace std;
int main(){
    int cas;cin>>cas;
    while(cas--){
        int n,k;cin>>n>>k;
        string str;cin>>str;
        int ans=0;
        for(int i=0;i<(k+1)/2;i++){
            int poi=i;
            unordered_map<char,int> mm;
            int cnt=0;
            while(poi<n){
                mm[str[poi]] ++;
                poi+=k;
                cnt++;
            }
            if(!(i == (k+1)/2-1 && (k%2)==1)){
            poi=k-1-i;
            while(poi<n){
                mm[str[poi] ]++;
                poi+=k;
                cnt++;
            }
            }
            int maxele=-1;
            char maxc;
            for(auto it:mm){
                maxele=max(maxele,it.second);
            }
            ans+=(cnt-maxele);
        }
        
        cout<<ans<<endl;
    }
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值