Codeforces Round #630 (Div. 2) C. K-Complete Word (贪心)

题目传送门

题意:给定一长度为n的字符串求修改最小次数使其成为回文的周期为k的字符串(保证n%k==0)

思路:因为既是回文又是周期,所以长度为k的串也是回文串。即 i %k 和 (k-1)-(i%k) 是要相等的。根据贪心思想,只需找到每个位置出现次数最多的相同字母 ,用总次数减去该次数就是每个位置最小的修改次数,最后求和即可。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t,n,k;
	cin>>t;
	while(t--){
		string a;
		cin>>n>>k>>a;
		int ans=0;
		map<char,int>mp[k];
		for(int i=0,p;i<n;i++)
		{
			p=min(i%k,k-1-(i%k));
			mp[p][a[i]]++;
		}
		for(int i=0;i<k;i++)
		{
			int mx=0,sum=0;
			for(auto j:mp[i])
			{
				mx=max(j.second,mx);
				sum+=j.second;
			}
			ans+=sum-mx;
		}
		cout<<ans<<endl;
	}
	return 0;
}