「ALFR Round 3」C 割
给定一个字符串
给定两个字符串
因此,最终的划分方案中,一定要让每个子串中
把那些出现个数更大的分段放到前面。除了最后一段外,让划分的边界刚好在每一段最后一个
如果
否则,最后一段的
#include<bits/stdc++.h>
using namespace std;
char s[240520];
int a[240520];
int main(){
ios::sync_with_stdio(0);cin.tie(0);
int n,k;cin>>n>>k;
vector<int>v;
char mx=' ';
cin>>s+1;
for(int i=1;i<=n;i++)mx=max(mx,s[i]);
for(int i=1;i<=n;i++)if(s[i]==mx)v.emplace_back(i);
int pos=n;a[n]=n+1;
for(int i=n-1;i>=1;i--){
a[i]=pos;
if(s[i]>=s[pos])pos=i;
}
if(v.size()%k){
cout<<string(v.size()/k+1,mx);
}else{
cout<<string(v.size()/k,mx);
for(int i=a[v.back()];i<=n;i=a[i])cout<<s[i];
}
return 0;
}
另注:上面代码中的 cin>>s+1 从 C++20 开始就不能用了,会 CE。