列表

详情


NC205070. 牛牛喜欢字符串

描述

牛牛现在有一个长度n的字符串(仅包含小写字母),他现在把这个字符串,每隔k个就分出来一个子串,比如[1,k]为第一个子串,[k+1,2k]为第二个、[2k+1,3k]为第三个.....(保证n%k=0) 
牛牛想要把这些子串都变成一样的。他可以选择任意一个子串的任意一个字符进行更改,但是他太懒了,他想让你帮他算算最少要进行多少次操作。

输入描述

第一行输入n(1≤n≤106)和k(1≤k≤n  数据保证n%k=0),第二行输入该字符串。

输出描述

输出需要的最少操作次数

示例1

输入:

6 2
abaaba

输出:

2

说明:

改为aaaaaa

示例2

输入:

6 3
abbabb

输出:

0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 65ms, 内存消耗: 1368K, 提交时间: 2020-06-21 15:17:22

#include<bits/stdc++.h>
using namespace std;
int n,k;
char s[1000006];
int main()
{
	scanf("%d%d",&n,&k);
	scanf("%s",s);
	int an=0;
	for(int i=0;i<k;i++)
	{
		map<char,int> mp;
		int mx=0;
		for(int j=i;j<n;j+=k)
		{
			mp[s[j]]++;
			mx=max(mx,mp[s[j]]);
		}
		an+=(n/k-mx);
	}
	printf("%d\n",an);
}

C(clang11) 解法, 执行用时: 26ms, 内存消耗: 2220K, 提交时间: 2021-03-16 22:25:00

#include<stdio.h>
char s[1000005];
int main()
{
	int i,j,k,l,n,m,max,sum=0;
	scanf("%d%d\n",&n,&m);
	gets(s);
	for(i=0;i<m;i++){
		max=0;
		int a[26]={0};
		for(j=i;j<n;j+=m)
		a[s[j]-97]++;
		for(j=0;j<26;j++)
		if(max<a[j])
		max=a[j];
		sum+=(n/m)-max;
	}
	printf("%d",sum);
}

C++11(clang++ 3.9) 解法, 执行用时: 11ms, 内存消耗: 1512K, 提交时间: 2020-06-21 15:41:22

#include<bits/stdc++.h>
using namespace std;
 
char R[1000005];
int main()
{
    int i,j,n,k,ans=0;
    scanf("%d%d%s",&n,&k,R);
    for(i=0;i<k;i++)
    {
    	int V[26]={0},t=0;
		for(j=i;j<n;j+=k)V[R[j]-'a']++,t=max(V[R[j]-'a'],t);
		ans+=n/k-t;
	}
    printf("%d\n",ans);
}

Python3(3.9) 解法, 执行用时: 1067ms, 内存消耗: 4832K, 提交时间: 2021-04-07 15:59:45

n,k=map(int,input().split())
cnt=0
s=input()
for i in range(k):
    a={}
    for j in s[i::k]:
        if j not in a:
            a[j]=1
        else:a[j]+=1
    a_s=sorted(a.items(),key=lambda x:x[1])
    cnt+=n//k-a_s[-1][1]
print(cnt)

上一题