题目描述

思路
这个和翻硬币的那个题很像,不过翻硬币只有翻或不翻,二元状态,但这个修改,可以修改成任何数,因为我们想要令修改次数最少,即某个位置上的某个字母出现的最多(看代码理解),那我们就把其余不是他的都改成最多的,这样就是修改最少了
代码
统计每个位置上出现的次数(因为修改是修改成重复的字符串,即abcebf,要想修改成2个重复的,即abcabc , 每个位置上要对应)
要读题!!如果不能整除!要输出-1!!!!!!!!!!不要看一半!
cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
char s[N];
int cnt[N];
int main()
{
int n;
cin >> n;
cin >> s;
int len = strlen(s); //求长度
if(len % n != 0)
{
cout<<"-1"<<endl;
return 0;
}
int k = len / n;//每个划分后的字符串长度
//如何统计每个位置的字符串出现的次数?
//代码能力
int maxx = 0;
int ans = 0;
for(int i = 0; i < k; i++)
{
maxx = 0;
memset(cnt, 0, sizeof cnt); //别忘了对cnt数组初始化
for(int j = 0; j < n; j++)
{
cnt[s[i+k * j] - 'a']++; //统计每个位置的,有点难想,不过可以记下来
maxx = max(maxx, cnt[s[i+k * j] - 'a']); //直接比较了,也不用再遍历一遍了
}
ans += n - maxx;
}
cout<<ans<<endl;
return 0;
}
总结
认真读题!!
有时候不满足输出-1可以混分!!