题解:P10810 【MX-S2-T1】变
Part 0 题目大意:
给定
Part 1 算法分析:
最开始看到这个题目,是想用动态规划的,但发现不好推动态转移方程,就算推出来也是
接下来,我们设
Part 2 时间复杂度:
表面上我们用了三层循环,时间复杂度应是
Code :
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int k;
string str;
int s[30];
signed main()
{
cin>>k>>str;
int len=str.size();
str=' '+str;
for(int i=1;i<=len;i++)//枚举最小循环节
{
if(len%i==0)
{
int mod=len/i;//区间个数
int ans=0;
for(int j=1;j<=i;j++)//枚举区间中的每一位
{
int maxn=-1;
memset(s,0,sizeof s);
for(int k=1;k<=mod;k++)//枚举每个区间
{
int l=j+(k-1)*i;
s[str[l]-'a'+1]++;
maxn=max(maxn,s[str[l]-'a'+1]);//最多有几个区间不要改
}
ans+=mod-maxn;
// cout<<ans<<" ";
}
if(ans<=k)
{
cout<<i<<'\n';
exit(0);
}
}
}
return 0;
}
悄咪咪的说一句,这题思维无,代码难度无,所以建议降橙,但也算一道下位黄吧。