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;
}