题目描述

给出一个正整数n,我们把1..n在k进制下的表示连起来记为s(n,k),例如s(16,16)=123456789ABCDEF10, s(5,2)=11011100101。现在对于给定的n和字符串t,我们想知道是否存在一个k(2 ≤ k ≤ 16),使得t是s(n,k)的子串。

输入描述:

第一行一个整数n(1 ≤ n ≤ 50,000)。

第二行一个字符串t(长度 ≤ 1,000,000)

输出描述:

"yes"表示存在满足条件的k,否则输出"no"

输入例子:

8

01112

输出例子:

yes

这里我之前就写了一套可以将任意进制转换为2~62进制的代码,可以直接套用(注意仅针对非负数)。

要注意判断为yes时及时退出,避免无谓的后续计算,这里的思想总体来说属于暴力法,好像也只有这样了(摊手),不过还是要夸夸C++的stl库,效率不错。

有其他好方法记得留言交流哦!感谢!

该题还可以进一步优化,先找出t中的最大值,然后从该进制往上数,数到16时结束。

代码如下:

 1 #include <iostream>
 2 #include <string>
 3 #include <cmath>
 4 #include <algorithm>
 5
 6 using namespace std;
 7
 8 //将任意字符转换为十进制
 9 long long convertToDec(char c)
10 {
11     long long decNum;
12     if(c>='a' && c<='z')
13         decNum=c-87;
14     else if(c>='A' && c<='Z')
15         decNum=c-29;
16     else if(c>='0' && c<='9')
17         decNum=c-48;
18
19     return decNum;
20 }
21
22 //将十进制转换为这些字符[0-9a-zA-Z],61个字符,最大表示62进制
23 char convertFromDec(long long c)
24 {
25     long long objchar;
26     if(c>=10 && c<=35)
27         objchar=c+87;
28     else if(c>=36 && c<=61)
29         objchar=c+29;
30     else if(c>=0 && c<=9)
31         objchar=c+48;
32
33     return objchar;
34 }
35
36 //从原进制转换为2~62的任意进制(src:源进制,obj:目标进制,num:源进制下的数)
37 string convert(int src,int obj,int num)
38 {
39
40     string num_str=to_string(num);
41
42     long long decNum=0;//十进制数(中间数)
43     for(long long i=0;i<num_str.size();++i)
44         decNum+=convertToDec(num_str[i])*pow(src,num_str.size()-1-i);
45
46     string strTmp;
47     long long tmp;
48     while(decNum>0)
49     {
50         tmp=decNum % obj;
51         strTmp=convertFromDec(tmp)+strTmp;
52         decNum/=obj;
53     }
54     return strTmp;
55 }
56
57
58 int main()
59 {
60     int n;
61     string t;
62     while(cin>>n>>t)
63     {
64         transform(t.begin(),t.end(),t.begin(),::tolower);//将t转换为小写了(因为本次题目用大写表示16进制的数,而我们的程序中是用小写表示16进制的)
65         bool Isyes=false;
66         //保存转换后的字符串,2~16进制共15种
67         vector<string> str_converted2To16(15);
68      //该题还可以进一步优化,先找出t中的最大值,然后从该进制往上数,数到16时结束(而不是从2往上数)。
69         for(int k=2;k<=16;++k)
70         {
71             //对1~n的每个数字进行转换
72             for(int i=1;i<=n;++i)
73             {
74                 str_converted2To16[k-2]+=convert(10,k,i);
75             }
76             if(str_converted2To16[k-2].find(t)!=string::npos)
77             {
78                 Isyes=true;
79                 cout<<"yes"<<endl;
80                 break;
81             }
82         }
83         if(!Isyes)
84             cout<<"no"<<endl;
85     }
86     return 0;
87 }

补充:

  大小写转换函数请用全局命名空间中的函数,这也是lower前面要加::全局作用符的原因。因为有多个不同的版本。

  详情可参见https://stackoverflow.com/questions/5539249/why-cant-transforms-begin-s-end-s-begin-tolower-be-complied-successfu

 
 

转载于:https://www.cnblogs.com/xiaoxi666/p/7077273.html

codeM美团编程大赛初赛B轮E题相关推荐

  1. CodeM美团点评编程大赛初赛A轮 B.合并回文子串【区间Dp】

    [编程题] 合并回文子串 时间限制:2秒 空间限制:262144K 输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变.如"abc"和"xyz&qu ...

  2. 牛客网-2018 美团 CodeM 编程大赛-初赛 A 轮

    ACM模版 这场比赛没有晋级,以为没有好好打--我又在找借口.下午去办入职体检,比赛开始时还在回来路上,回到宿舍的时候就剩下半个小时了,签了一下到就没时间了.赛后发现第三题很有意思,就补了补-- 1- ...

  3. CodeM美团点评编程大赛 初赛B轮 A 黑白树 贪心 E 子串 暴力

    A题类似想到给多个区间,求最少多少个区间可以覆盖全部的问题,求法就是从当前这步能够到达的区间里,选一个下一步能到的最大值,对于本题,区别一是树形结构,不是一维的直线了,区别二是点都是连续的,不是离散的 ...

  4. 超级码力在线编程大赛初赛 第2场 1.三角魔法

    超级码力在线编程大赛初赛 第2场 1.三角魔法 题目链接 描述 小栖必须在一个三角形中才能施展魔法,现在他知道自己的坐标和三个点的坐标,他想知道他能否施展魔法 −1e9≤xi,yi≤1e9-1e9\l ...

  5. 超级码力在线编程大赛初赛第1场-1-树木规划题解

    目录 题目描述 示例 输入 输出 说明 分析 代码 动规 贪心 其他题目 题目描述 在一条直的马路上,有n棵树,每棵树有一个坐标,代表它们距离马路起点的距离. 如果每相邻的两棵树之间的间隔不小于d,那 ...

  6. 超级码力在线编程大赛初赛 第3场 1.最大公倍数

    超级码力在线编程大赛初赛 第3场 1.最大公倍数 题目链接 描述 小栖有一个区间,他准备从中取三个数,他想知道如何取才能使得它们的最小公倍数最大 请直接告诉小栖最小公倍数是多少. 示例 输入: a = ...

  7. 超级码力在线编程大赛初赛 第2场 题解

    超级码力在线编程大赛初赛 第2场 题解 题目出的对退役老年选手很友好,拿个T恤跑路- 下面的题解仅代表个人观点,出了问题,概不负责. 比赛链接:https://tianchi.aliyun.com/o ...

  8. 2021年CSP-J入门级初赛(第一轮)真题讲解

    2017年NOIP普及组初赛真题讲解 2017年NOIP普及组初赛真题讲解_哔哩哔哩_bilibili 2018年NOIP普及组初赛真题讲解 2018年NOIP普及组初赛真题讲解_哔哩哔哩_bilib ...

  9. 2014第六届华为创新杯编程大赛初赛解题报告

    还是忍不住想吐槽华为,吐槽华为举办的这个比赛. 第一场是一星比赛,水题.不过比赛为什么在考试系统上?华为不愧是世界500强企业,招聘考试能走到机试的人数应该在百人左右吧.第一次举办如此大规模 的比赛还 ...

  10. 美团编程大赛-优惠券 (set)

    题目描述 美团点评上有很多餐馆优惠券,用户可以在美团点评App上购买.每种优惠券有一个唯一的正整数编号.每个人可以拥有多张优惠券,但每种优惠券只能同时拥有至多一张.每种优惠券可以在使用之后继续购买. ...

最新文章

  1. 关于MNIST数据集的处理
  2. 网络爬虫-python-爬取天涯求职贴
  3. corda_Corda服务的异步流调用
  4. 十六、PHP框架Laravel学习笔记——构造器的增删改
  5. qt通过代码创建滚动区域,添加滚动区域到窗口
  6. Spring mvc @ModelAttribute
  7. c语言第二章网上作业答案,c语言第二章课后习题答案
  8. wordpress用途_8个热门WordPress多用途主题及其炫酷功能
  9. java解析json字符串数据
  10. Vue中的自定义指令
  11. 微信戴圣诞帽的一个简易实现程序
  12. linux程序设计学习心得,几点学习Linux编程的建议
  13. Windows 10系统下Outlook日历怎么显示农历?
  14. 汉诺塔(hanio)
  15. iPhoneSE4完虐国产手机,国产旗舰手机还有啥遮羞布?
  16. 【ML特征工程】第 7 章 :通过K-Means 模型堆叠进行非线性特征化
  17. 每天坚持“踮脚尖”,时间久了,身体会收获什么?每天踮多久?
  18. keycloak 验证 token
  19. Speedoffice(PPT)怎么自定义设置幻灯片大小
  20. 方舟编译器的下载与安装配置及小组分工

热门文章

  1. linux下获取程序所在目录绝对路径
  2. 用OpenGL进行立方体表面纹理贴图
  3. 逻辑运算符 用法解释
  4. HDOJ2005 ( 第几天? ) 【水题】
  5. Android数据的几种存储方式---------SharePreferences(轻量的以键值对) 的使用
  6. 1.MongoDB入门详解
  7. 微型计算机系统视频适配器为,计算机硬件基础1-微型计算机系统组成(含教材6,8,9章内容).ppt...
  8. c语言写一元一次函数图像,一元一次函数练习题带答案.doc
  9. 电脑太慢了最简单的办法怎么弄_最简单快速的方法恢复电脑误删文件-数据恢复常见问题...
  10. 小程序授权登录,后台发送链接,得到参数。