列表

详情


NC218878. 学姐的编码2.0

描述

学姐最近喜欢上了编码,尤其是十六进制编码,但是学姐特别挑剔,在学姐眼中,只有逐位递增的编码才是一个优美的编码,比如12,58都是优美的编码,85,22则都不是优美的编码,现在学姐得到了一个编码串,她希望你按照字典序从小到大输出该编码串里可查询到的所有不重复的优美的编码,对于单个字符组成的编码,学姐总是认为这个编码是优美的,且优美的编码当中是允许存在前导零的

编码可查询的判定依据:在给定编码串中删去任意k位字符,剩下字符不改变顺序组成一个新的编码,则认为可在中查询到,如0102中可查询的编码有0,1,2,00,01,02,10,12,010,012,002,102,0102

输入描述

一个字符串s表示所给十六进制编码串(1≤|s|≤1000000)
(保证所给编码串与标准十六进制一致,编码串中仅可能出现0-9与A-F,不会有多余字符出现)

输出描述

按字典序从小到大输出所有满足条件的编码

示例1

输入:

001A

输出:

0
01
01A
0A
1
1A
A

示例2

输入:

00A1

输出:

0
01
0A
1
A

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 113ms, 内存消耗: 8556K, 提交时间: 2021-05-06 15:50:18

#include "bits/stdc++.h"
using namespace std;
string s;
vector<int>p[20];
inline int change(char x){
    if(x>='A')return x-'A'+10;
    return x-'0';
}
void dfs(int st,int x,string s1){
    for(int i=st;i<=15;i++){
        auto it=upper_bound(p[i].begin(),p[i].end(),x);
        if(it!=p[i].end()){
            cout<<s1+s[*it]<<endl;
            dfs(i+1,*it,s1+s[*it]);
        }
    }
}
int main()
{
    cin>>s;
    for(int i=0;i<s.size();i++)
        p[change(s[i])].push_back(i);
    dfs(0,-1,"");
    return 0;
}

上一题