题目链接:https://codeforces.com/contest/670/problem/F

题意:

有一个非负整数 $n$,在它的右侧添上它的位数后,被发送出去;例如 $6510$,加上位数 $4$,变成 $65104$,发送出去。

但是,接受者接收到的数字则是被打乱了的,例如接收到了 $01465$,发送者只知道其中一段数字是什么,例如知道原数字中有一段是 $51$。

要你根据已知的信息推测出可能的 $n$ 中最小的那个。

题解:

首先在大约 $O(n)$ 的时间复杂度下可以知道这个数字是 $k$ 位。

然后,我们可以知道这个数字是由 $c_0$ 个 $0$、$c_1$ 个 $1$、……、$c_9$ 个 $9$,以及一段给定的一段数字 $t$ 组成的。

我们要考虑如何找出最小的那个,不妨考虑如下可能的情况:

1、$t$ + $c_0$ 个 $0$ + …… + $c_9$ 个 $9$。

2、在 $1 \sim 9$ 找一个最小的打头,剩下的依旧按照若干个 $0$ + …… + 若干个 $9$ 排列,其中 $t$ 按照 $t[0]$ 是什么,插在那个数的左侧或者右侧;例如 $10022599$,而 $t = [223]$,则有可能是答案的是 $100[223]22599$ 或者 $10022[223]599$;另一种例子是 $1089$,$t = [63]$,则可能是答案的是 $10[63]89$。

答案只可能是以上这些情况中的一种。

AC代码:

#include<bits/stdc++.h>
using namespace std;
const int SIZE=1e6+;
char s[SIZE],t[SIZE];
int slen,tlen;
int cnt_s[],cnt_t[];
int digit()
{
int dgt;
vector<int> v;
for(dgt=tlen;dgt<=slen;dgt++)
{
int tp[]={}, k=dgt;
while(k) ++tp[k%], k/=; bool ok=; for(int i=;i<;i++) if(cnt_t[i]+tp[i]>cnt_s[i]) ok=; int sum=;
for(int i=;i<;i++) sum+=cnt_s[i]-tp[i];
if(sum!=dgt) ok=; if(ok)
{
for(int i=;i<;i++) cnt_s[i]-=cnt_t[i]+tp[i];
return dgt;
}
}
}
bool check(const string& s) //检查前导零
{
if(s.size()> && s[]=='') return ;
else return ;
}
int main()
{
ios::sync_with_stdio();
cin.tie(), cout.tie(); cin>>s>>t;
slen=strlen(s), tlen=strlen(t); for(int i=;i<slen;i++) cnt_s[s[i]-'']++;
for(int i=;i<tlen;i++) cnt_t[t[i]-'']++;
int dgt=digit(); string res1,res2,res3; res1=t;
for(int i=;i<;i++)
{
for(int j=;j<=cnt_s[i];j++)
{
res1+=(char)(''+i);
}
} for(int i=;i<;i++)
{
if(cnt_s[i]>)
{
res2+=(char)(''+i);
res3+=(char)(''+i);
cnt_s[i]--;
break;
}
}
for(int i=;i<;i++)
{
if(t[]-''==i) res2+=(string)t; while(cnt_s[i]>)
{
res2+=(char)(''+i);
res3+=(char)(''+i);
cnt_s[i]--;
} if(t[]-''==i) res3+=(string)t;
} string ans;
if(!check(res1)) ans=(ans.size()?min(ans,res1):res1);
if(!check(res2)) ans=(ans.size()?min(ans,res2):res2);
if(!check(res3)) ans=(ans.size()?min(ans,res3):res3);
cout<<ans<<'\n';
}

Codeforces 670F - Restore a Number - [字符串]的更多相关文章

  1. CodeForces 670F Restore a Number

    模拟. 首先暴力找到答案的位数,然后就是分类讨论输出答案. #pragma comment(linker, "/STACK:1024000000,1024000000") #inc ...

  2. 【11.61%】【codeforces 670F】Restore a Number

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. Codeforces Round #350 (Div. 2) F. Restore a Number 模拟构造题

    F. Restore a Number   Vasya decided to pass a very large integer n to Kate. First, he wrote that num ...

  4. Codeforces C. Split a Number(贪心大数运算)

    题目描述: time limit per test 2 seconds memory limit per test 512 megabytes input standard input output ...

  5. [Codeforces 1208D]Restore Permutation (树状数组)

    [Codeforces 1208D]Restore Permutation (树状数组) 题面 有一个长度为n的排列a.对于每个元素i,\(s_i\)表示\(\sum_{j=1,a_j<a_i} ...

  6. Codeforces Round #567 (Div. 2)B. Split a Number (字符串,贪心)

    B. Split a Number time limit per test2 seconds memory limit per test512 megabytes inputstandard inpu ...

  7. Codeforces Round #300(A.【字符串,多方法】,B.【思维题】,C.【贪心,数学】)

    A. Cutting Banner time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  8. dp --- Codeforces 245H :Queries for Number of Palindromes

    Queries for Number of Palindromes Problem's Link:   http://codeforces.com/problemset/problem/245/H M ...

  9. 【codeforces 805D】Minimum number of steps

    [题目链接]:http://codeforces.com/contest/805/problem/D [题意] 给你一个字符串; 里面只包括a和b; 让你把里面的"ab"子串全都去 ...

随机推荐

  1. Linux系统如何将某一程序设置为开机自启动

    文章来源:百度知道. Linux开机启动程序详解 我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍L ...

  2. Ubuntu菜鸟入门(十七)—— E: Sub-process /usr/bin/dpkg returned an error code (1) 出错解决方案

    cd /var/lib/dpkg sudo mv info info.bak sudo mkdir infosudo apt-get install shotwel

  3. [转]ssh和SSH服务(包含隧道内容)

    本文对SSH连接验证机制进行了非常详细的分析,还详细介绍了ssh客户端工具的各种功能,相信能让各位对ssh有个全方位较透彻的了解,而不是仅仅只会用它来连接远程主机. 另外,本人翻译了ssh客户端命令的 ...

  4. 我对android开发的一点小感悟小看法

    “Android”,“Android开发”等等这些词成了时下最热的词,也是时下大众最关注最吸引人眼球的话题,当然,最热门的行业也意味着高薪,好的就业环境,但同时也意味着强大的竞争力! Android系 ...

  5. 在layui layer 弹出层中加载 layui table

    layui.use('table', function(){ var table = layui.table; layer.open({ type : 1, area : [ "600px& ...

  6. mysql5.7.20安装

    MySQL 的官网下载地址:http://www.mysql.com/downloads/ 一.各版本的区别 1. MySQL Community Server 社区版本,开源免费,但不提供官方技术支 ...

  7. Java知多少(22)方法重载

    在Java中,同一个类中的多个方法可以有相同的名字,只要它们的参数列表不同就可以,这被称为方法重载(method overloading). 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺 ...

  8. Java知多少(29)覆盖和重载

    在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类 ...

  9. CFA一级知识点总结

    更多来自:   www.vipcoursea.com   Ethics 部分 Objective of codes and standard:永远是为了maintain public trust in ...

  10. 第三百九十七节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,主题本地化设置

    第三百九十七节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,主题本地化设置 主题设置是在xadmin\plugins\themes.py这个文件 默认xadmin是通过下面这 ...