Codeforces 1332C. K-Complete Word

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

 

posted @ 2020-04-07 20:52  mcalex  阅读(255)  评论(0编辑  收藏  举报