题解 | 游游的字母翻倍

游游的字母翻倍

https://www.nowcoder.com/practice/e10ed38e315442fc9772004c58582c8f

//  #牛客春招刷题训练营# https://www.nowcoder.com/discuss/726480854079250432
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main(){
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  string s;
  size_t size;
  int q;
  cin >> size >> q;
  cin >> s;
  vector<int> a(size, 1);//-------给每个字母一个位置,上面的字母个数初始为1
  int len, l, r;
  while(q--){
    cin >> l >> r;
    len = r - l + 1;//--------一共可以复制几份
    l--;
    int ls = 0;
    while(l > 0){//--------转化索引
      l -= a[ls];
      ls++;
    }
    if (ls > 0){//---------纠正,主要正对前面减多了(l<0)(没有刚刚好踩在两个字母之间)
      a[ls - 1] -= l;
      len += l;
    }
    while(len > 0){//----------------翻倍
      if (a[ls] <= len){
        len -= a[ls];
        a[ls] *= 2;
      }
      else{
        a[ls] += len;
        len = 0;
      }
      ls++;
    }
  }
  for (int i = 0; i < size; i++){
    while(a[i]--){
      cout << s[i];
    }
  }
}

#写题解领奖励##牛客春招刷题训练营#
全部评论

相关推荐

07-02 22:46
门头沟学院 Java
码农索隆:hr:“管你投没投,先挂了再说”
点赞 评论 收藏
分享
06-23 11:43
门头沟学院 Java
allin校招的烤冷...:我靠,今天中午我也是这个hr隔一个星期发消息给我。问的问题还是一模一样的😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务