luogu P9539 树学 题解
题意(抽象向)
构造一个字符串,使得与原字符串的相似度在给出范围内的前提下,让字典序最小。
思路(清晰向)
考虑贪心,毕竟普及组的题不能往难里想。。。
- 从前往后对字符串扫一遍,并记录相似度,遇到
a就做一个标记,直到当前的相似度已经大于给出范围的右边界 \(r\)。 - 标记数如果不到左边界 \(l\) ,从后往前扫,把没有标记的都补上,直到有 \(l\) 个。
- 再从前往后扫一遍,有标记就输出原始的字符,没有的话,看该位是不是
a,是就输出b(因为没有标记所以不能重复),不是就输出a。
贪心的正确性不证自明。
代码(丑陋向)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000006;
bool c[maxn];
int n,l,r,cnt = 0;
string s;
int main(){
ios::sync_with_stdio(false);
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> l >> r >> s;
for(int i = 0;i < n;i++){
if(s[i] == 'a'){
cnt++;
c[i] = 1;
if(cnt == r) break;
}
}
for(int i = n - 1;i >= 0;i--){
if(cnt >= l) break;
if(c[i]) continue;
c[i] = 1;
cnt++;
}
for(int i = 0;i < n;i++){
if(s[i] == 'a' &&
c[i] == 0)
cout << 'b';
else if(c[i] == 0)
cout<<'a';
else
cout << s[i];
}
return 0;
}
结束力,点个赞呗~~~

浙公网安备 33010602011771号