ssoj1046密码pasuwado(树状数组+暴力)

题目描述

       哪里有压迫,哪里就有反抗。
       moreD的宠物在法庭的帮助下终于反抗了。作为一只聪明的宠物,他打算把魔法使moreD的魔法书盗去,夺取moreD的魔法能力。但moreD怎么会让自己的魔法书轻易地被盗取?moreD在魔法书上设置了一个密码锁,密码锁上有一个问题。
       施以斯卧铺魔法吧,你有M次机会,如此将得完美密码。
       然后是一串小写字母串。
       moreD的宠物斯卧铺魔法就是施法时的字符串其中 相邻两位交换
       而moreD对于完美密码的定义自然是 最小字典序了。
       请帮助moreD的宠物,想出密码吧。

输入

第一行一个整数M,表示操作次数。
第二行一串小写字母组成的字符串S,如题目所示。

输出

输出完美密码。

样例输入

3dcba

样例输出

adcb

提示

【数据范围】

       对于30%的数据|S|≤10

对于60%的数据|S|≤3,000

       对于100%的数据8≤|S|≤100,000 M≤(|S|-8)^2+2

【后记】

       宠物最终战胜了moreD,和自己的宠物快乐地生活着。

【样例解释】

       先对第3,4两位施法,字符串变成dcab,然后对第2,3两位施法,字符串变成dacb,最后对第1,2两位施法,字符串变成adcb。


#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn=100005;
const int cn=96;
int len,fst[31],nxt[maxn];
ll sm,n,sum[maxn];
char s[maxn];
inline ll lowbit(ll x){
    return (ll)(x&-x);
}
inline void add(ll x,ll v){
    while(x<len){
        sum[x]+=v;
        x+=lowbit(x);
    }
}
inline ll getsum(ll x){
    ll ans=0;
    while(x){
        ans+=sum[x];
        x-=lowbit(x);
    }
    return ans;
}
int main(){
    memset(fst,0,sizeof(fst));
    memset(nxt,0,sizeof(nxt));
    scanf("%lld",&n);
    scanf("%s",s+1);
    len=strlen(s+1);
    for(int i=len;i>=1;--i)nxt[i]=fst[s[i]-cn],fst[s[i]-cn]=i;
    for(int i=1;i<=len;++i)add(i,1);
    for(int i=1;i<=len;++i){
        int j;
        for(j=1;j<=26;++j){
            int pos=fst[j];
            if(pos==0)continue;
            sm=getsum(pos-1);
            if(n>=sm){
                n-=sm;
                add(pos,-1);
                fst[j]=nxt[pos];
                printf("%c",j+cn);
                break;
            }
        }
    }
    return 0;
}


思路:贪心,每次把能加到的最小的往前加。直接暴力会超时,用树状数组维护。

注意:n要用long long还有读入要记得修改!TAT


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Postman是一款常用的API开发和测试工具,可以用于发送HTTP请求并查看响应结果。在Postman中,可以通过Authorization界面来设置请求的认证方式。 以下是使用Postman的Authorization界面进行认证的步骤: 1. 打开Postman应用程序,并创建一个新的请求。 2. 在请求的URL栏中输入需要发送请求的URL地址。 3. 点击右侧的"Authorization"选项卡,进入认证设置界面。 4. 在认证设置界面中,选择合适的认证类型。根据提供的引用内容,可以选择"OAuth 2.0"认证类型。 5. 在"OAuth 2.0"认证类型下,填写相应的认证参数。根据提供的引用内容,需要填写"Authorization URL"和"Access Token URL"。 - 在"Authorization URL"中,填写引用中提供的URL地址:http://localhost:8090/auth/oauth/authorize?client_id=ssoj-pc&response_type=token - 在"Access Token URL"中,填写引用中提供的URL地址:http://localhost:8080/oauth/token?code=6s9qUj&grant_type=authorization_code&redirect_uri=http://www.mayikt.com/callback&scope=all 6. 根据需要,填写其他相关的认证参数,例如"Client ID"、"Client Secret"等。 7. 点击"Get New Access Token"按钮,开始进行认证流程。 8. 根据认证流程的要求,可能需要输入用户名和密码等信息。 9. 完成认证流程后,会在界面上显示获取到的Access Token信息。 10. 点击"Use Token"按钮,将Access Token添加到请求的Header中。 11. 完成认证设置后,可以点击"Send"按钮发送请求,并查看响应结果。 请注意,以上步骤仅为示例,实际使用时需要根据具体的认证方式和参数进行设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值