题解 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;
}

浙公网安备 33010602011771号