E. Masha-forgetful(dp)

news2024/10/7 12:19:25

题目:Problem - E - Codeforceshttps://codeforces.com/contest/1624/problem/E

题意:

玛莎认识了一个新朋友,并知道了他的电话号码 s  。电话号码是一个长度为m的字符串,它由从 0-9 组成 。

电话号码可能以 0 开头。 玛莎已经知道 n 个电话号码(所有号码都有相同的长度 m )。对她来说,用她已经知道的数字片段来表示,记住一个新号码会更容易。每个数字片段长度至少为 2 ,否则分段太多,玛莎会搞混。

例如,玛莎需要记住数字: s = ‘12345678’ ,并且她已经知道 n = 4 ,号码:' 12340219 ',' 20215601 ',' 56782022 ',' 12300678 '。你可以将 s 分为一个 3 段:一号的“1234”,二号的“56”,三号的“78”。

还有其他方法来表示 s 。 玛莎请你帮忙,她请你将 s 分成长度至少为2的多个段或者更多她已经知道的数字。如果有几个可能的答案,打印其中任何一个。

Input:

测试用例有t组  1<= t <=10^4 

有n个号码,长度为m 1 ≤n,m ≤10^3

输入n个号码,而后输入 s

Output:

若无答案则输出-1。反之输出你答案的长度,并且输出其L,R 和 I 。分别表示在第I个号码的L到R

input:
2

4 8
12340219
20215601
56782022
12300678
12345678

2 3
134
126
123

output:
3
1 4 1
5 6 2
3 4 3
-1

思路:

数字片段的长度至少为2,说明所有的数字片段可以分解为长度为2或3,长度为4=两个长度为2相加。所以预处理先遍历出2、3长度的数字片段及其相关信息并且将其保存到map里。

通过f[]保存状态,先预处理,f[2]表示s[2]之前的信息,即f[2]=s[0,1],f[3]=s[0,1,2]。将f[1]={0,0,0}表示无效信息。

而后进行遍历,若 f[i-2] 且 mp[s.substr(i - 2, 2)] 是有效的,则 f[i]=mp[s.substr(i - 2, 2)](f[i-2]表示s[i-2]之前的信息。 mp[s.substr(i - 2, 2)]则表示s[i-2,i-1])。f[i-3]同理进行判断。若都不满足则设置为无效信息。

如果最后的f[m]是存在有效信息则表示该结果有解,用vector逆序保存信息。否则输出-1。

代码:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;

struct point {//保存输出信息
	int x, y, n;
};
map<string, point>mp;
vector<point>ans;
point f[1010];
bool checked(point p) {//判断是否合法。
	if (p.x == 0 && p.y == 0 && p.n == 0) {
		return 0;
	}
	return 1;
}

int main() {
	int t;
	cin >> t;
	while (t--) {
		mp.clear();
		string s, subs;
		int n, m;
		cin >> n >> m;
		for (int i = 1;i <= n;i++) {//预处理保存片段
			cin >> s;
			for (int j = 0;j < m - 1;j++) {
				subs = s.substr(j, 2);
				mp[subs] = { j + 1,j + 2,i };
			}
			for (int j = 0;j < m - 2;j++) {
				subs = s.substr(j, 3);
				mp[subs] = { j + 1,j + 3,i };
			}
		}
		ans.clear();
		cin >> s;
		f[1] = mp[""];//{0,0,0}
		if (m >= 2)f[2] = mp[s.substr(0, 2)];
		if (m >= 3)f[3] = mp[s.substr(0, 3)];
		for (int i = 4;i <= m;i++) {
			if (checked(f[i - 2]) && checked(mp[s.substr(i - 2, 2)])) {
				f[i] = mp[s.substr(i - 2, 2)];
			}
			else if (checked(f[i - 3]) && checked(mp[s.substr(i - 3, 3)])) {
				f[i] = mp[s.substr(i - 3, 3)];
			}
			else {
				f[i] = f[1];
			}
		}
		//for (int i = 1;i <= m;i++) cout << 'f' << i << " == " << f[i].x << " " << f[i].y << " " << f[i].n << " " << endl;
		if (checked(f[m])) {
			int pos = m;
			while (pos != 0) {
				ans.push_back(f[pos]);
				pos -= f[pos].y - f[pos].x + 1;
			}
			cout << ans.size() << endl;
			for (int i = ans.size() - 1;i >= 0;i--) {
				cout << ans[i].x << " " << ans[i].y << " " << ans[i].n << endl;
			}
		}
		else {
			cout << -1 << endl;
		}
	}
}

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

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

相关文章

花30分钟,用Jenkins部署码云上的SpringBoot项目

本文介绍 jenkins 如何从 gitee 上 clone 项目&#xff0c;然后使用 maven 打包并后台启动。 1.Jenkins 介绍 Jenkins 是一个开源软件项目&#xff0c;是基于 Java 开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&…

7月4号作业

实现底层实现三盏灯的控制 head.h #ifndef __HEAD_H__ #define __HEAD_H__#define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014#define PHY_RCC 0X50000A28#define PHY_LED2_MODER 0X50007000 #define PHY_LED2_ODR 0X50007014#endif led.c #in…

2023年,第九届WWEC教育者大会隆重回归

2023年第九届WWEC教育者大会将于8月20日至22日在上海举行。本次大会也是时隔两年之后再度重启&#xff0c;是疫情恢复常态化后教育界的首次重要大会。 WWEC教育者大会由宋辉先生发起&#xff0c;嘉家有品主办&#xff0c;君学书院、雁传书文化传媒和有鹏来教育科技联合主办。本…

jdbcTemplate的queryForList报错:Incorrect column count: expected 1, actual 2

jdbcTemplate的queryForList方法有多种传参形式&#xff0c;我们常用的就是这种传class类&#xff0c;参数返回数据&#xff0c;结果报expected 1, actual 2&#xff0c;意思是预期只返回一列&#xff0c;但却返回了2列。这是不合理的&#xff0c;因为返回参数都是List&#xf…

PCL 法向量估计源码学习

一、思路&#xff1a; 二、源码 #ifndef PCL_FEATURES_IMPL_NORMAL_3D_H_ #define PCL_FEATURES_IMPL_NORMAL_3D_H_#include <pcl/features/normal_3d.h>/// template <typename PointInT, typename PointOutT> void pcl::NormalEstimation<PointInT, PointOutT…

【Matlab】智能优化算法_海洋捕食者算法MPA

【Matlab】智能优化算法_海洋捕食者算法MPA 1.背景介绍1.1 布朗运动1.2 莱维运动 2.数学模型2.1 MPA配方2.2 MPA优化场景2.3 涡流形成与FAD效应 3.文件结构4.伪代码5.详细代码及注释5.1 func_plot.m5.2 Get_Functions_details.m5.3 initialization.m5.4 levy.m5.5 main.m5.6 MP…

【H5】文件上传(ajax)

系列文章 【移动设备】iData 50P 技术规格 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/130604517 【H5】avalon前端数据双向绑定 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/131067187 【H5】安卓自动更新方案&a…

Python_装饰器

目录 简单装饰器 语法糖 *args、**kwargs处理有参数的函数 带参数的装饰器 类装饰器 不带参数的类装饰器 带参数的类装饰器 装饰器执行顺序 functools.wraps 讲 Python 装饰器前&#xff0c;我想先举个例子&#xff0c;虽有点污&#xff0c;但跟装饰器这个话题很贴切。…

select……for update 到底加的什么锁

先上结论 主键索引唯一索引普通索引普通字段等值查询行锁行锁行锁间隙锁&#xff0c;锁表范围查询间隙锁&#xff0c;锁范围行间隙锁&#xff0c;锁范围行间隙锁&#xff0c;锁范围行间隙锁&#xff0c;锁表 数据表准备 DROP TABLE IF EXISTS t_user_test; CREATE TABLE t_u…

【Web3】MetaMask钱包配置

目录 主网更换测试网 私钥如何登录钱包 主网更换测试网 私钥如何登录钱包

docker安装ES,IK分词器,Kibana

dockerhub上自己搜要拉的镜像版本 // 拉取es 6.8.0的镜像版本 docker pull elasticsearch:6.8.0// 运行es镜像 docker run -d -p 9300:9300 -p 9200:9200 --name elasticsearch elasticsearch:6.8.0运行报错了 ERROR: [1] bootstrap checks failed [1]: max virtual memory are…

Michael.W基于Foundry精读Openzeppelin第3期——Arrays.sol

Michael.W基于Foundry精读Openzeppelin第3期——Arrays.sol 0. 版本0.1 Arrays.sol 1. 补充&#xff1a;关于storage的定长数组和动态数组的layout2. 目标合约3. 代码精读3.1 unsafeAccess(address[] storage, uint256)3.2 unsafeAccess(bytes32[] storage, uint256)3.3 unsafe…

限时等待的互斥量

本文结束一种新的锁&#xff0c;称为 timed_mutex 代码如下&#xff1a; #include<iostream> #include<mutex> #include<thread> #include<string> #include<chrono>using namespace std;timed_mutex tmx;void fun1(int id, const string&a…

MySql入门操作

一.前节回顾 1.web项目环境配置 2.通用增删改&#xff0c;通用查询方法 3.前台&#xff0c;后台代码显示效果 所有你都理解了吗&#xff1f; 二.Mysql数据库介绍 1.什么是MySQL&#xff1f; MySQL是一种开源的关系型数据库管理系统。它是目前最流行和广泛使用的数据库之一&…

【Java|golang】2679. 矩阵中的和

给你一个下标从 0 开始的二维整数数组 nums 。一开始你的分数为 0 。你需要执行以下操作直到矩阵变为空&#xff1a; 矩阵中每一行选取最大的一个数&#xff0c;并删除它。如果一行中有多个最大的数&#xff0c;选择任意一个并删除。 在步骤 1 删除的所有数字中找到最大的一个…

NodeJS 后端返回Base64格式数据显示图片 ⑩⑨ (一篇就够了)

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言Base64前端服务器总结 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618; ⡖⠒⠒⠒⠤⢄⠀⠀⠀ …

【Java语法小记】求字符串中某个字符的数量——IntStream流的使用

文章目录 引入需求代码原理解读s.chars()IntStream filter​(IntPredicate predicate)long count()补充&#xff1a;IntStream peek​(IntConsumer action) 流操作和管道 引入需求 从一段代码引入 return s.length() - (int) s.chars().filter(c -> c S).count(); 其中 (…

文心一言 VS 讯飞星火 VS chatgpt (54)-- 算法导论6.2 6题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;53&#xff09;-- 算法导论6.2 5题 六、证明:对一个大小为 n的堆&#xff0c;MAX-HEAPIFY 的最坏情况运行时间为 Ω(Ign)。(提示对于n个结点的堆&#xff0c;可以通过对每个结点设定恰当的值&#xff0c;使得从根结点到叶结点路径…

2023年房地产投资退出途径研究报告

第一章 房地产投资概况 房地产&#xff08;Real Estate&#xff09;是一个涵盖了土地及其上的永久性建筑&#xff08;如建筑物和房屋&#xff09;和自然资源&#xff08;如矿产&#xff0c;水源&#xff0c;作物&#xff09;的经济学概念。它可以分为四类&#xff1a;住宅房地…

大数据面试题-场景题

1.手写Flink的UV 手写Flink的UV 2.Flink的分组TopN Flink的分组TopN 3.Spark的分组TopN 1&#xff09;方法1&#xff1a; &#xff08;1&#xff09;按照key对数据进行聚合&#xff08;groupByKey&#xff09; &#xff08;2&#xff09;将value转换为数组&#xff0c;利…