P10810 【MX-S2-T1】 变
题目背景
原题链接:https://oier.team/problems/S2A。
题目描述
已知一个仅由小写英文字母构成的字符串 s s s。
每次操作时,你可以任意选择 s s s 中的一个字符,并将它修改为任意小写英文字母。
你可以按任意顺序对其进行不超过 k k k 次操作,以最小化 s s s 的严格循环节的长度。当然,不进行操作也是可以的。
请输出在进行完所有操作后,最小的可能的 s s s 的严格循环节的长度。
一个字符串 t t t 被称为 s s s 的严格循环节,当且仅当 s s s 可以通过将 t t t 重复若干次来构造。
例如:
mai
是maimai
的严格循环节,dx
是dx
的严格循环节。但ov
不是ovo
的严格循环节。
输入格式
第一行一个非负整数 k k k。
第二行一个字符串 s s s,仅包含小写英文字母。
输出格式
一行一个整数,表示答案。
输入输出样例 #1
输入 #1
1
test
输出 #1
4
输入输出样例 #2
输入 #2
3
test
输出 #2
1
输入输出样例 #3
输入 #3
3
apollo
输出 #3
3
说明/提示
【样例解释 #1】
可以证明:最多进行一次操作的情况下,严格循环节长度至少为 4 4 4。
【样例解释 #2】
可以通过
3
3
3 次操作,将 test
修改为 ssss
,严格循环节长度为
1
1
1。
【数据范围】
本题采用捆绑测试。
- Subtask 0(17 pts): k = 0 k = 0 k=0, ∣ s ∣ ≤ 6 |s| \leq 6 ∣s∣≤6。
- Subtask 1(14 pts): k = 1 k = 1 k=1, ∣ s ∣ ≤ 20 |s| \leq 20 ∣s∣≤20。
- Subtask 2(16 pts): k = 1 k = 1 k=1, ∣ s ∣ ≤ 500 |s| \leq 500 ∣s∣≤500。
- Subtask 3(32 pts): k < ∣ s ∣ ≤ 1 0 5 k < |s| \leq 10^5 k<∣s∣≤105。
- Subtask 4(21 pts): 无特殊限制。
对于所有测试数据,保证 0 ≤ k < ∣ s ∣ ≤ 1 0 6 0 \leq k < |s| \leq 10^6 0≤k<∣s∣≤106, s s s 中仅包含小写英文字母。
2024.7.28:新增了一组 Hack 数据。
C++实现
#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;
}
if(ans<=k)
{
cout<<i<<'\n';
exit(0);
}
}
}
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容