luogu P9539 树学 题解

原题链接

题意(抽象向)

构造一个字符串,使得与原字符串的相似度在给出范围内的前提下,让字典序最小。

思路(清晰向)

考虑贪心,毕竟普及组的题不能往难里想。。。

  1. 从前往后对字符串扫一遍,并记录相似度,遇到 a 就做一个标记,直到当前的相似度已经大于给出范围的右边界 \(r\)
  2. 标记数如果不到左边界 \(l\) ,从后往前扫,把没有标记的都补上,直到有 \(l\) 个。
  3. 再从前往后扫一遍,有标记就输出原始的字符,没有的话,看该位是不是 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;
}

结束力,点个赞呗~~~

posted @ 2023-08-23 09:37  CultReborn  阅读(23)  评论(0)    收藏  举报