[蓝桥杯 2020 国 C] 重复字符串
题目描述
如果一个字符串
S
S
S 恰好可以由某个字符串重复
K
K
K 次得到,我们就称
S
S
S 是
K
K
K 次重复字符串。例如 abcabcabc
可以看作是 abc
重复
3
3
3 次得到,所以 abcabcabc
是
3
3
3 次重复字符串。
同理 aaaaaa
既是
2
2
2 次重复字符串、又是
3
3
3 次重复字符串和
6
6
6 次重复字符串。
现在给定一个字符串 S S S,请你计算最少要修改其中几个字符,可以使 S S S 变为一个 K K K 次字符串?
输入格式
输入第一行包含一个整数 K K K。
第二行包含一个只含小写字母的字符串 S S S。
输出格式
输出一个整数代表答案。如果 S S S 无法修改成 K K K 次重复字符串,输出 − 1 −1 −1。
样例 #1
样例输入 #1
2
aabbaa
样例输出 #1
2
提示
其中, 1 ≤ K ≤ 1 0 5 1 \le K \le 10^5 1≤K≤105, 1 ≤ ∣ S ∣ ≤ 1 0 5 1 \le |S| \le 10^5 1≤∣S∣≤105。其中 ∣ S ∣ ∣S∣ ∣S∣ 表示 S S S 的 长度。
蓝桥杯 2020 年国赛 C 组 G 题。
#include<iostream>
#include<cstring>
#include<string>
#include<map>
using namespace std;
int n,mmax;
string s;
int sum;
int main()
{
cin>>n>>s;
if(s.size()%n!=0){
cout<<-1;//不能被整除直接排除
return 0;
}
int t=s.size()/n;//可以分为几组
for(int i=0;i<t;i++)//循环组数
{
map<char,int>mm;//记录每一组的各个位置上的字母出现个数
int res=0;//答案
for(int j=i;j<s.size();j+=t)
{//这里是+t,一组一组来看
mm[s[j]]++;
}
for(int i=0;i<+26;i++)
{
res=max(res,mm[i+'a']);
}
sum+=n-res;//把不一样的的其他数删咯的和
}
cout<<sum;
return 0;
}