Codeforces Round #630 (Div. 2) C. K-Complete Word

Codeforces Round #630 (Div. 2) C. K-Complete Word

题目链接
http://codeforces.com/contest/1332/problem/C
题意
给一个字符串,你需要把它变成一个回文串,并且有该字符串的循环节长度为m,问最少操作数.
例如 abaabaabaaba 为回文,并且循环节为 aba,满足题意
思路
要使得整个字符串为回文串,则必须循环节也为回文串。所以我们可以把字符串拆成n/m个长度为m的子串
看下面这个例子
21 7
wudixiaoxingxingheclp
w u d i x i a
o x i n g x i
n g h e c l p
我们要把这三个都变成一样的回文串,可以一位一位考虑,找到出现次数最多的字符
第一位
w a
o i
n p
都只出现一次 所以花费为 6-1=5;
第二位
u i
x x
g l
x 出现两次 花费为 6-2=4;
依次类推 就好了

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e3+7;
const int mod=1e9+7;
string s;
map<int ,int >mp;
int main (){
    int k;
    cin>>k;
    while(k--){
        int n,m,ans=0;
        cin>>n>>m>>s;
        int x=n/m,ma;
        for(int i=0;i<m/2;i++){
                mp.clear();
                ma=1;
            for(int j=0;j<x;j++){
                int xx1=s[i+j*m]-'a',xx2=s[(j+1)*m-i-1]-'a';
                mp[xx1]++;
                ma=max(mp[xx1],ma);
                mp[xx2]++;
                ma=max(mp[xx2],ma);
            }
            ans+=2*x-ma;
        }
        ma=1;
        mp.clear();
        if(m%2==1){       //考虑一下 m为奇数的情况
            for(int i=m/2;i<=n;i+=m){
                int xx=s[i]-'a';
                mp[xx]++;
                 ma=max(mp[xx],ma);
            }
            ans+=x-ma;
        }
        printf ("%d\n",ans);
    }
}
发布了22 篇原创文章 · 获赞 9 · 访问量 2945

猜你喜欢

转载自blog.csdn.net/hddddh/article/details/105242606