AtCoder Beginner Contest 295——F - substr = S

news2024/11/23 15:17:36

蒟蒻来讲题,还望大家喜。若哪有问题,大家尽可提!

Hello, 大家好哇!本初中生蒟蒻讲解一下AtCoder Beginner Contest 295这场比赛的F题

===========================================================================================

F - substr = S

原题

Problem Statement

You are given a string S S S consisting of digits and positive integers L L L and R R R for each of T T T test cases. Solve the following problem.
For a positive integer x x x, let us define f ( x ) f(x) f(x) as the number of contiguous substrings of the decimal representation of x x x (without leading zeros) that equal S S S.
For instance, if S = S= S= 22, we have f ( 122 ) = 1 f(122) = 1 f(122)=1, f ( 123 ) = 0 f(123) = 0 f(123)=0, f ( 226 ) = 1 f(226) = 1 f(226)=1, and f ( 222 ) = 2 f(222) = 2 f(222)=2.
Find ∑ k = L R f ( k ) \displaystyle \sum_{k=L}^{R} f(k) k=LRf(k).

Constraints

1 ≤ T ≤ 1000 1 \le T \le 1000 1T1000
S S S is a string consisting of digits whose length is between 1 1 1 and 16 16 16, inclusive.
L L L and R R R are integers satisfying 1 ≤ L ≤ R ; 1 0 16 1 \le L \le R ; 10^{16} 1LR;1016.

Input

The input is given from Standard Input in the following format, where c a s e i \rm{case}_i casei denotes the i i i-th test case:
T T T
c a s e 1 \rm{case}_{1} case1
c a s e 2 \rm{case}_{2} case2
⋮ \vdots
c a s e T \rm{case}_{\it{T}} caseT
Each test case is in the following format:
S S S L L L R R R

Output

Print T T T lines in total.

The i i i-th line should contain an integer representing the answer to the i i i-th test case.

Sample Input 1

6
22 23 234
0295 295 295
0 1 9999999999999999
2718 998244353 9982443530000000
869120 1234567890123456 2345678901234567
2023032520230325 1 9999999999999999

Sample Output 1

12
0
14888888888888889
12982260572545
10987664021
1
This input contains six test cases.
In the first test case, S = S= S= 22, L = 23 L=23 L=23, R = 234 R=234 R=234.
f ( 122 ) = f ( 220 ) = f ( 221 ) = f ( 223 ) = f ( 224 ) = ⋯ = f ( 229 ) = 1 f(122)=f(220)=f(221)=f(223)=f(224)=\dots=f(229)=1 f(122)=f(220)=f(221)=f(223)=f(224)==f(229)=1.
f ( 222 ) = 2 f(222)=2 f(222)=2.
Thus, the answer is 12 12 12.
In the second test case, S = S= S= 0295, L = 295 L=295 L=295, R = 295 R=295 R=295.
Note that f ( 295 ) = 0 f(295)=0 f(295)=0.


题目大意

本题是求 ∑ k = L R f ( k ) \displaystyle \sum_{k=L}^{R} f(k) k=LRf(k)
f ( k ) = k f(k)=k f(k)=k这个数转换为字符串后,出现S的个数
例如: k = 222 , S = 22 k=222,S=22 k=222,S=22
f ( k ) = 2 f(k)=2 f(k)=2

思路

本题让我们求 ∑ k = L R f ( k ) \displaystyle \sum_{k=L}^{R} f(k) k=LRf(k)
那么可以利用前缀和的思想转化为求 ∑ k = 1 R f ( k ) − ∑ k = 1 L − 1 f ( k ) \displaystyle \sum_{k=1}^{R}f(k) - \displaystyle \sum_{k=1}^{L - 1}f(k) k=1Rf(k)k=1L1f(k)

所以我们的主要任务就是求 ∑ k = 1 X f ( k ) ( 1 ≤ X ≤ 1 0 16 ) \displaystyle \sum_{k=1}^{X}f(k)(1\le X \le 10^{16}) k=1Xf(k)(1X1016)

然后我们可以构造 k k k,对于有值的 f ( k ) f(k) f(k)那么一定是包含 S S S的,那么我们可以枚举 S S S在哪一位,因为一共就只有16位。
如图:
在这里插入图片描述

情况一:S没有前导零

我们相应的计算S在每一位上有多少个数:(注意:这里位数是从0开始的,这里k相当于前面的X)
在这里插入图片描述
于是我们就可以设i为从S在第k位第第i小的数,此处我们还是以S = 95为例 (注意:这里位数是从0开始的,这里k相当于前面的X)在这里插入图片描述

这样,我们就能精准的计算出有没有越界(即为这个数有没有大于 X X X

情况二:S有前导零

我们可以为了以防出现 S = 05 , k = 1 , i = 0 S=05, k = 1, i = 0 S=05,k=1,i=0结果算成了 f ( 5 ) = 1 f(5) = 1 f(5)=1这样的情况发生

我们可以在前面补个S的前面补充一个1。如 S = 05 S=05 S=05
i = 1 , k = 3 i=1,k=3 i=1,k=3时,就是10500
所以我们不再是和情况一样是 i − 1 i-1 i1,而是 i − 1 + 1 0 r i-1+10^r i1+10r
r = k + 1 − ∣ S ∣ r=k+1-|S| r=k+1S ∣ S ∣ |S| S表示S的长度)

例如, S = 05 , i = 151 , k = 3 S=05, i=151, k = 3 S=05,i=151,k=3时:
r = 3 + 1 − 2 = 2 r=3+1-2=2 r=3+12=2
所以填写的就是: i − 1 + 1 0 r = 150 + 1 0 2 = 150 + 100 = 250 i-1+10^r=150+10^2=150+100=250 i1+10r=150+102=150+100=250

所以对应填入:

05
20550

之后,我们可以用一个函数 n u m b e r ( i , k , s ) number(i, k, s) number(i,k,s)表示 k k k位填充 S S S后,第 i i i小的数。之后通过二分找到最大的没有超过边界的数,然后加上这个最大的 i i i即可。最后把答案累加!
具体看代码吧


代码

#include <iostream>
#include <cstring>
#include <algorithm>
#define int long long
#define endl '\n'
#define psb(i) push_back(i)
#define ppb() pop_back()
#define psf(i) push_front(i)
#define ppf() pop_front()
#define ps(i) push(i)

using namespace std;

typedef pair<int, int> PII;

const int N = 2e1 + 10;

int T;
string s;
int l, r;
int p10[N];

inline int read()
{
    int w = 1, s = 0;
    char c = getchar();
    while (c < '0' || c > '9')
    {
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') s = s * 10 + c - '0', c = getchar();
    
    return w * s;
}

inline void init()
{
	p10[0] = 1;
	for (int i = 1; i <= 16; i ++)
		p10[i] = p10[i - 1] * 10;
}

int number(int i, int k, string s)
{
	int r = k + 1 - s.size();
	
	if (r < 0) return -1;
	if (s[0] == '0') i += p10[r];
	i --;
	
	int p = i / p10[r]; //有前导零补得数
	int q = i % p10[r];
	
	return p * p10[k + 1] + stoll(s) * p10[r] + q;
}

inline int solve(int x, string s)
{
	int res = 0;
	for (int k = 0; k <= 15; k ++)
	{
		int first = number(1, k, s);
		
		if (first == -1 || first > x) continue;
		
		int l = 1, r = p10[16 - s.size()];
		while (l <= r)
		{
			int fd = l + r >> 1;
			if (number(fd, k, s) > x) r = fd - 1;
			else l = fd + 1;
		}
		
		res += r;
	}
	
	return res;
}

signed main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    
    init();
    
    cin >> T;
    
    while (T --)
    {
    	cin >> s >> l >> r;
    	
    	cout << solve(r, s) - solve(l - 1, s) << endl;
    }
    
    return 0;
}

今天就到这里了!

大家有什么问题尽管提,我都会尽力回答的!

吾欲您伸手,点的小赞赞。吾欲您喜欢,点得小关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

双塔模型:微软DSSM模型浅析

1.背景 DSSM是Deep Structured Semantic Model (深层结构语义模型) 的缩写&#xff0c;即我们通常说的基于深度网络的语义模型&#xff0c;其核心思想是将query和doc映射到到共同维度的语义空间中&#xff0c;通过最大化query和doc语义向量之间的余弦相似度&#xff0c;从而训…

2023好玩的解压游戏,压力大点开玩可以放松自己

你是不是经常感觉到压力大&#xff1f; 现代社会&#xff0c;竞争逐步激烈&#xff0c;不管是来自学习上&#xff0c;工作上&#xff0c;还是生活上的&#xff0c;压力都非常大&#xff01; 这时候&#xff0c;我们要学会自我减压&#xff0c;有效的放松是为了更好地前行。 …

JavaWeb开发 —— MyBatis基本操作

目录 一、环境准备 二、删除操作实现 1. 根据主键删除 2. 删除&#xff08;预编译SQL&#xff09; 2.1 SQL注入 2.2 参数占位符 三、新增操作实现 1. 新增代码实现 2. 新增&#xff08;主键返回&#xff09; 四、更新操作实现 五、查询操作实现 1. 根据ID查询 1.1…

【Python】pip 和 conda install、list的区别,是否一致

【Python】pip 和 conda install、list的区别&#xff0c;是否一致 文章目录【Python】pip 和 conda install、list的区别&#xff0c;是否一致1. 介绍2. 看效果2.1 首先&#xff0c;conda 创建环境2.2 然后&#xff0c;激活环境2.3 查看环境下已经安装包列表2.4 安装新的包&am…

【2023最新】超详细图文保姆级教程:App开发新手入门(2)

上章节我们已经成功的创建了一个 App 项目&#xff0c;接下来我们讲述一下&#xff0c;如何导入项目、编辑代码和提交项目代码。 Let’s Go! 4. 项目导入 当用户创建一个新的应用时&#xff0c;YonStudio 开发工具会自动导入模板项目的默认代码&#xff0c;不需要手动进行代…

C语言的Hello World的汇编剖析(64位 Intel架构)

C语言的Hello World的汇编剖析&#xff08;64位 Intel架构&#xff09; 文章目录C语言的Hello World的汇编剖析&#xff08;64位 Intel架构&#xff09;一. 前提准备二. C转换为汇编操作准备2.1 创建目录&复制代码2.2 C文件转换为汇编文件三. 剖析汇编文件四. 指令相关五. …

TenserRT(三)PYTORCH 转 ONNX 详解

第三章&#xff1a;PyTorch 转 ONNX 详解 — mmdeploy 0.12.0 文档 torch.onnx — PyTorch 2.0 documentation torch.onnx.export 细解 计算图导出方法 TorchScript是一种序列化和优化PyTorch模型的格式&#xff0c;将torch.nn.Module模型转换为TorchScript的torch.jit.Scr…

ERTEC200P-2 PROFINET设备完全开发手册(6-1)

6 报警和诊断 Profinet提供了强大的诊断功能&#xff0c;这是其他通讯协议所无法比拟的。PN设备检测到问题后可以向控制器发送报警信息&#xff0c;报警分为三大类&#xff1a; 诊断报警 &#xff08;PN设备本身故障触发的报警&#xff0c;例如&#xff1a;温度测量通道变送电…

Activiti学习02

这里写目录标题一、流对象简介1.1 事件1.2 活动1.3 条件二、Activiti系统服务结构图核心类:服务类:RepositoryServiceRuntimeServiceTaskServiceHistoryServiceFormServiceIdentityServiceManagementService三、Activiti数据库支持一、流对象简介 一个业务流程图有三个流对象的…

ATFX国际:中国一季度GDP同比增长4.5%,社消总额约11.5万亿元

ATFX国际&#xff1a;中国统计局发布一季度国民经济运行报告&#xff0c;其中值得关注两大数据分别为GDP同比增速、社会消费品零售总额增速。统计显示&#xff0c;一季度GDP总额28.5万亿元&#xff0c;同比增长4.5%&#xff0c;其中第一产业和第二产业的增速低于平均值&#xf…

Pyqt案例讲解(实现模拟计算器效果)

PyQt5是一个用于Python的GUI框架&#xff0c;它提供了一个简单易用的GUI工具包&#xff0c;可以用于创建各种类型的应用程序&#xff0c;包括计算器。下面是一个简单的计算器的实现&#xff0c;其中包括了一些难点和复杂的地方。 难点&#xff1a; 使用Qt的布局管理器来创建窗…

证书扫描件怎么弄?手机也能轻松扫描

现代社会中&#xff0c;证书是人们展示自己能力和经历的重要凭证。然而&#xff0c;我们有时需要将证书扫描并保存在电脑或手机中&#xff0c;以备不时之需。本文将介绍如何扫描证书以及手机上是否能进行扫描。 证书扫描的方法 将证书扫描成电子文档可以方便地将其存储在电脑或…

C++ Primer 第7章 类 - 中(零基础学习C++,精简学习笔记)

&#x1f916; 作者简介&#xff1a;努力的clz &#xff0c;一个努力编程的菜鸟 &#x1f423;&#x1f424;&#x1f425; &#x1f440; 文章专栏&#xff1a;C Primer 学习笔记 &#x1f4d4;专栏简介&#xff1a; 本专栏是博主学习 C Primer 的学习笔记&#xff0c;因为…

技巧:WIN10手动指定某个应用程序使用独立显卡

目录1. 背景2. 解决方法&#xff0c;假如要让剪映始终使用独立显卡2.1 步骤1&#xff0c;右击电脑桌面空白处&#xff0c;选择“显示设置”2.2 步骤2&#xff0c;拉到最下面&#xff0c;点击图形设置2.3 步骤3&#xff0c;选择桌面应用&#xff0c;点击浏览2.4 步骤4&#xff0…

领课在线教育系统源码 各行业都适用的分布式在线教育系统+支持讲师入驻功能

领课教育系统&#xff08;roncoo-education&#xff09;是基于领课网络多年的在线教育平台开发和运营经验打造出来的产品&#xff0c;致力于打造一个各行业都适用的分布式在线教育系统。系统采用前后端分离模式&#xff0c;前台采用vue.js为核心框架&#xff0c;后台采用Spring…

bash shell 无法使用 perl 正则

1.案例现象 前几天有一个小伙伴在群里求助&#xff0c;说他这个 shell 脚本有问题&#xff0c;让大家帮忙看看 #!/bin/bash regularExpression"^\[(\d)\].$" contentcat $1 for i in ${content} doif [[ $i ~ $regularExpression ]]thenecho -e "\033[32m 【 i…

一款多参数多合一的空气质量传感器【温湿度、TVOC甲醛CO2粉尘等】

档案馆库房专用的一款智能型空气质量云测仪 空气质量检测仪 空气质量传感器 环境集成传感器 集成/温湿度、粉尘PM2.5 PM10/甲醛/TVOC/CO2等高度集成的一款传感器/RS485信号输出 ◆温度测量参数: (1)温度测量范围: -40~80℃(2&#xff09;输出分辨率:0.1oC (3&#xff09;…

从零开始学架构——高性能负载均衡

高性能负载均衡 单服务器无论如何优化&#xff0c;无论采用多好的硬件&#xff0c;总会有一个性能天花板&#xff0c;当单服务器的性能无法满足业务需求时&#xff0c;就需要设计高性能集群来提升系统整体的处理性能。高性能集群的本质很简单——通过增加更多的服务器来提升系…

Pandas入门实践1 -初探

我们将开始介绍Series、DataFrame和Index类&#xff0c;它们是pandas的基本构建块&#xff0c;并展示如何使用它们。在本节结束时&#xff0c;您将能够创建DataFrame并对它们执行操作以检查和筛选数据。 DataFrame剖析 DataFrame由一个或多个Series组成。Series的名称构成列名…

( “树” 之 DFS) 111. 二叉树的最小深度 ——【Leetcode每日一题】

111. 二叉树的最小深度 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a; 叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2…