题解 CF1332C 【K-Complete Word】

Solution

  • 考虑贪心

  • 根据性质\(1\)和性质\(2\),显然,字符串的第\(i\)位和第\(k+1-i\)位和字符串的第\(i+nk\)位的字母都要相等。

  • 枚举位置,统计这些位置的各个相同字母的个数。

  • 显然,循环节个数为n/k,所以字母的总个数为 $ n/k*2 $。

  • 然后令ans+=字母总个数-这些相同字母个数的最大值\(maxx\)

  • 当然,如果正好循环到中间(\(i==k+1-i\))的话,字母的总个数为 \(n/k\)且统计的相同字母个数的最大值为\(maxx/2\)

  • \(ans\)+=\(n/k-maxx/2\)

  • 快乐输出

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,k,t,ans[26],maxx,cnt=0;
char c[200001];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&k);
		scanf("%s",c+1);cnt=0;
		for(int i=1;i<=k/2+(k&1);i++){
			int l=i,r=k+1-i;maxx=0;
			for(int j=l;j<=n;j+=k) ans[c[j]-'a']++;
			for(int j=r;j<=n;j+=k) ans[c[j]-'a']++;
			for(int j=0;j<=25;j++) maxx=max(maxx,ans[j]);
			if(l==r) cnt+=(n/k)-maxx/2;
			else cnt+=(n/k)*2-maxx;
			for(int j=l;j<=n;j+=k) ans[c[j]-'a']--;
			for(int j=r;j<=n;j+=k) ans[c[j]-'a']--;
		}
		printf("%d\n",cnt);
	}
	return 0;
}
posted @ 2020-04-29 13:03  Ciciiiii  阅读(127)  评论(0)    收藏  举报