题目大意:
现在我们称一个字符串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;
}

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

700

被折叠的 条评论
为什么被折叠?



