K-Complete Word
题目链接:https://codeforces.com/contest/1332/problem/C
题目大意:给你一个字符串,问你最少需要换多少个字母才能使其成为K-Complete Word
解题思路:由于k是n的一个因子,因此n可以为划分为n/k个相同长度的字符串。题目要求
s[1]=s[1+k]=...=s[1+temp*k],而在最后一个划分为长度为k的字串中,s[1+temp*k]==s[n];
因此可以推的这个长度为k的字符串也必须是一个回文串。后面贪心一下即可,每次算一下s[1]和s[k]
统计这几个位置相同字符最大是多少,然后求的即可
#include<bits/stdc++.h> using namespace std; const int maxn=2e5+10; int n,k,cnt[30],num,mx; char s[maxn]; int main() { int t; cin>>t; while(t--) { cin>>n>>k; scanf("%s",s); int sum=0,ans=0; int l,r; for(int i=0;i<(k+1)/2;i++) { for(int j=0;j<26;j++) cnt[j]=0; l=i,r=k-i-1; for(int j=0;j<n/k;j++) { int p,q; p=l+j*k,q=r+j*k; if(p==q) cnt[s[p]-'a']++; else cnt[s[p]-'a']++,cnt[s[q]-'a']++; } mx=0; for(int j=0;j<26;j++) mx=max(mx,cnt[j]); // cout<<mx<<endl; sum+=mx; } ans=n-sum; cout<<ans<<endl; } }