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