CodeForces 1332-C K-Complete Word(区段回文串)

CodeForces 1332-C K-Complete Word(区段回文串)

https://codeforces.com/contest/1332/problem/C

 

 

 

题意:

给一个长度为n的字符串,让你将它修改成n/k段相等的回文段,求最小的修改次数。

 

思路:

我们先将字符串按k长度分区:

{XXX...XX}{XXX...XX}...{XXX...XX}

最后要求是回文串,所以每个分区都是完全一样的回文串,记录长度为[k/2]的分区的每个位置每个字母出现的次数就可以了,然后贪心,出现次数最多的字母不用改,其它字母全改掉。

 

#include <bits/stdc++.h>
typedef long long LL;
const int INF=0x3f3f3f3f;
const double eps =1e-8;
const int mod=1e8;
const int maxn=2e5+10;
using namespace std;
 
int a[maxn][30];
char str[maxn];
 
int main()
{
    #ifdef DEBUG
    freopen("sample.txt","r",stdin);
    #endif
    
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,k;
        scanf("%d %d %s",&n,&k,str);
        for(int i=0;i<n;i++)
            a[min(i%k,k-i%k-1)][str[i]-'a']++;
        int ans=0;
        for(int i=0;i<k;i++)
        {
            int num=0;
            int MAX=0;
            for(int j=0;j<26;j++)
            {
                num+=a[i][j];
                MAX=max(MAX,a[i][j]);
                a[i][j]=0;
            }
            ans+=num-MAX;
        }
        printf("%d\n",ans);
    }
    
    return 0;
}

 

-

posted @ 2020-04-01 21:48  jiamian22  阅读(547)  评论(0编辑  收藏  举报