atcoder arc140 A

思路:循环节枚举最小修改数
#include<vector>
#include<iostream>
#include<string>
using namespace std;
int main()
{
    int len,k;cin>>len>>k;
    string op;cin>>op;
    vector<int> zm(2010,1e9);
    for(int T=1;T<=len;T++){//周期长度 
        if(len%T!=0) continue;
        int fis=0;
        int i=len/T;//循环次数 
        for(int j=0;j<T;j++){//枚举单个循环节内每个元素 
            vector<int> cnt(26);
            for(int l=0;l<i;l++)//枚举所有循环节内处在相同位置的数 
              cnt[op[j+l*T]-'a']++;
            int maxn=0;
            for(int m=0;m<26;m++) maxn=max(maxn,cnt[m]);//寻找循环节内字母数量最多的 
            fis+=i-maxn;//把不等于最大字母的都修改掉 
        }
        zm[T]=min(zm[T],fis); 
    }
    for(int i=1;i<=len;i++){
        if(k>=zm[i]){
            cout<<i<<endl;return 0;
        }
    }
}

 

posted on 2022-05-16 20:48  zesure  阅读(44)  评论(0编辑  收藏  举报

导航