2015蓝桥杯——密文搜索

2023-11-17

题目描述:

标题:密文搜索

福尔摩斯从X星收到一份资料,全部是小写字母组成。 他的助手提供了另一份资料:许多长度为8的密码列表。 
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。

请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。

数据格式:

输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024 紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000 
紧接着是n行字符串,都是小写字母组成,长度都为8

要求输出: 一个整数, 表示每行密码的所有排列在s中匹配次数的总和。

例如: 用户输入: aaaabbbbaabbcccc 2 aaaabbbb abcabccc

则程序应该输出: 4

这是因为:第一个密码匹配了3次,第二个密码匹配了1次,一共4次。

资源约定: 峰值内存消耗 < 512M CPU消耗 < 3000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0 注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。 注意: 
所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

思路1:

先对原串做一下预处理:对于原串中每8个连续的子串,存入二维数组中的一行中。然后对于子串,也是存入一行,之后与二维数组的每一行进行匹配,累加完全相同的。

其中,存每一行时,每一行开26个空间,每个空间对应一个小写字母,记录每个小写字母出现的次数。

不过,这种暴力解法,复杂度达到了10^10,所有如果数据量过大,会超时应该,不过对于蓝桥杯,应该可以拿一些分。

代码:

#include <bits/stdc++.h>
#define maxn 11288576 + 50
using namespace std;

string s;
int n;
int cnt[maxn][30];
int rem[30];
int ans;

void init(){
	int len = s.length();
	for(int i = 0; i <= len-8; ++i){
		for(int j = 0; j < 8; ++j){
			char ch = s[i + j];
			cnt[i][ch - 'a']++;
		}
	}
}

void calc(){
	int len = s.length();
	for(int i = 0; i <= len-8; ++i){
		int flag = 1;
		for(int j = 0; j < 26; ++j){
			if(cnt[i][j] != rem[j]){
				flag = 0;
				break;
			}
		}
		if(flag) ans++;
	}
}

int main(){
	cin >> s >> n;
	init();
	for(int t = 1; t <= n; ++t){
		string tmp;
		cin >> tmp;
		memset(rem, 0, sizeof(rem));
		for(int i = 0; i < 8; ++i){
			char ch = tmp[i];
			rem[ch - 'a']++;
		}
		calc();
	}
	cout << ans << endl;
	return 0;
}

思路2:

仔细分析上面的代码,发现主要的时间开销来自于子串与原串进行匹配时,需要遍历每一行,而原串的长度最大可达10^6,所以很费时。

既然发现是查找部分耗时严重,那么就尽力去优化查找了,不难想到二分查找,不过由于二分查找,一般适用于数字,所以就想,能否将这由8个字母组成的子串转为数字,方法是:将这26个字母对应0~25,就可以将这个子串转为26机制数,最后再转为10进制即可。这样就可以用二分进行查找了。

另外,不想手撸二分的话,可以直接用STL容器:set, map。这里由于每个子串匹配的数量不仅仅只有1个,所以我用来map。

代码:

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

string s;
int n;
map<ll, int>  mp;
int ans;

void init(){
	int len = s.length();
	for(int i = 0; i <= len - 8; ++i){
		//  将原串中从i开始之后的8个字符存入向量中 
		vector<char> v;			 
		for(int j = 0; j < 8; ++j){
			char ch = s[i + j];
			v.push_back(ch);
		}
		// 为了和子串比较,先排序 
		sort(v.begin(), v.end());
		// 将这个8个字符转为26进制数字,便于二分查找 
		ll sum = 0;
		for(int j = 0; j < 8; ++j){
			char ch = v[j];
			sum = sum * 26 + (ch - 'a');
		}
		mp[sum]++;
	}
}

int main(){
	cin >> s >> n;
	init();
	for(int t = 1; t <= n; ++t){
		string tmp;
		cin >> tmp;
		vector<char> v;			 
		for(int i = 0; i < 8; ++i){
			char ch = tmp[i];
			v.push_back(ch);
		}
		// 为了和原串比较,先排序 
		sort(v.begin(), v.end());
		// 将这个8个字符转为26进制数字,便于二分查找 
		ll sum = 0;
		for(int i = 0; i < 8; ++i){
			char ch = v[i];
			sum = sum * 26 + (ch - 'a');
		}
		ans += mp[sum];	
	}
	cout << ans << endl;
	return 0;
} 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2015蓝桥杯——密文搜索 的相关文章

  • 蓝桥杯:优秀的拆分

    蓝桥杯 优秀的拆分https www lanqiao cn problems 801 learning 目录 题目描述 输入描述 输出描述 输入输出样例 输入 输出 输入 输出 题目分析 位运算 AC代码 Java 题目描述 一般来说 一个
  • 蓝桥杯第十一届青少年Python组省赛试题

    选择题答案 ADDCA s input if s 2 er or s 2 ly s s 2 elif s 3 ing s s 3 print s n int input cnt 0 for i in range 2 n s 0 for j
  • C语言 在数组中找到和值为目标值的两个元素

    输入你的目标值target 就能找到相加为target的两个数了 自己输入一个数组 并且设定一个目标值 target 就能在数组中找到两个相加等于target的元素了 include
  • 2022第十三届蓝桥杯国赛真题javaB组

    文章目录 试题A 重合次数 试题B 数数 试题C 左移右移 试题D 窗口 试题E 迷宫 试题F 小球称重 试题G 背包与魔法 试题H 修路 试题I 围栏 试题J 好数之和 试题A 重合次数 本题总分 5 分 问题描述 在同一天中 从上午6
  • 蓝桥杯青少组python:第十三届省赛第一场

    选择题 1 下列二进制中最大数是 A 110 B 1010 C 1100 D 1001 2 以下方法 不是对文件读操作的是 A readline B readlines C readtext D read 3 以下对turtle库中函数描述
  • 蓝桥杯JAVA B组 2020(1)第五题 排序

    一 题目描述 小蓝最近学习了一些排序算法 其中冒泡排序让他印象深刻 在冒泡排序中 每次只能交换相邻的两个元素 小蓝发现 如果对一个字符串中的字符排序 只允许交换相邻的两个字符 则在所有可能的排序方案中 冒泡排序的总交换次数是最少的 例如 对
  • 通过int 关系运算符来 比较两个 float 变量的大小

    include
  • openGL之API学习(一九四)glGenTextures glActiveTexture

    glGenTextures产生的是一个比较小的整数id 纹理单元名 glActiveTexture激活的是纹理单元号 GL TEXTUREi 它们二者的关系为GL TEXTUREi GL TEXTURE0 id glBindTexture使
  • C++11 删除 字符串中的空格

    include
  • 对象的初始化和清理(构造和析构函数)

    对象的初始化和清理 1 1 构造函数 1 1 1 没有返回值 没有void 类名相同 可以发生重载 1 2 构析函数 1 2 1 没有返回值 没有void 函数名称 类名 不可以发生重载 不可以有参数 1 3 系统会默认调用 构造函数和析构
  • 过河卒 蓝桥杯 755

    题目描述 如图 A 点有一个过河卒 需要走到目标 B 点 卒行走规则 可以向下 或者向右 同时在棋盘上的 C 点有一个对方的马 该马所在的点和所有跳跃一步可达的点称为对方马的控制点 例如上图 C 点上的马可以控制 99 个点 图中的 P1
  • Java语言 ASCII to Hex 互转(IOT-示例)

    概述 最近想起之前做的IOT项目 使用JAVA写了一个
  • 蓝桥杯C/C++百校真题赛(3期)Day3(考勤刷卡、最大和)

    Day3 Q1 考勤刷卡 Q2 最大和 Q1 考勤刷卡 问题描述 小蓝负责一个公司的考勤系统 他每天都需要根据员工刷卡的情况来确定 每个员工是否到岗 当员工刷卡时 会在后台留下一条记录 包括刷卡的时间和员工编号 只 要在一天中员工刷过一次卡
  • 问题 D: 稀疏矩阵类型判断

    题目描述 输入一个稀疏矩阵 输出其类型 类型包括 上三角 对角线及其右上方的元素非0 其它元素为0 下三角 对角线及其左下方的元素非0 其它元素为0 对称 沿对角线对称的元素非0且相等 空矩阵 所有元素都为0 其它为普通矩阵 输入 输入包括
  • 三个小朋友分糖果

    题目描述 有甲 乙 丙三个小朋友 甲有x粒糖果 乙有y粒糖果 丙有z粒糖果 现在他们做一个游戏 从甲开始 将自己的糖平均分三份 自己留一份 其余两份分别给乙与丙 多余的糖果自己吃掉 然后乙与丙也依次这样做 问最后甲 乙 丙三人各有多少粒糖果
  • 剑指Offer 12—矩阵中的路径

    题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 如果 word 存在于网格中 返回 true 否则 返回 false 单词必须按照字母顺序 通过相邻的单元格内的字母构成 其中 相邻 单元格是那些水平相邻
  • 动态规划之多重背包模型

    前置知识 01背包问题 动态规划之01背包模型 如何何何的博客 CSDN博客 完全背包问题 动态规划之完全背包模型 如何何何的博客 CSDN博客 多重背包问题 给定一个有一定容量的背包 和 n 个物品 每个物品有 si 件 每个物品有其对应
  • 2021蓝桥杯模拟赛-跳跃

    题目 题目链接 题解 动态规划 算是比较基础的状态方程和状态定义 但是难点在于处理负权重的情况 代码 include
  • 第十二届蓝桥杯 2021年省赛真题 (Java 大学C组) 第二场

    蓝桥杯 2021年省赛真题 Java 大学C组 第二场 A 浮点数 B 求余 C 双阶乘 D 格点 E 整数分解 F 3 的倍数 G 特殊年份 H 小平方 I 完全平方数 J 负载均衡 A 浮点数 题目 问题描述 IEEE 754 规定一个
  • [蓝桥杯 2014 省 A] 波动数列

    题目链接 蓝桥杯 2014 省 A 波动数列 题目描述 观察这个数列 1 3 0 2

随机推荐

  • Tomcat配置内存和远程debug端口

    配置内存 需要在catalina bat中添加JAVA OPTS参数 如下内容 SET JAVA OPTS Xms256m Xmx1024m XX MaxNewSize 256m XX MaxPermSize 428m Duser time
  • 【Matlab】常用函数汇总(二)

    Matlab 是矩阵实验室 Matrix Laboratory 的英文缩写 是用于科学与工程计算的工具 Matlab 提供了许多常用的数学函数 本文主要介绍 Matlab 与统计 排序 求和与乘积 以及随机数相关的函数 目录 1 统计函数
  • Python支持向量回归SVR拟合、预测回归数据和可视化准确性检查实例

    最近我们被客户要求撰写关于支持向量回归的研究报告 包括一些图形和统计输出 支持向量回归 SVR 是一种回归算法 它应用支持向量机 SVM 的类似技术进行回归分析 正如我们所知 回归数据包含连续的实数 为了拟合这种类型的数据 SVR模型在考虑
  • 软件工程学习日记(4)----面向数据流的设计方法

    用面向数据流的方法设计下列系统的软件结构 问题回顾 为方便储户 某银行拟开发计算机储蓄系统 储户填写的存款单或取款单由业务员输入系统 如果是存款 系统记录存款人姓名 住址 存款类型 存款日期 利率等信息 并印出存款单给储户 如果是取款 系统
  • 四元组与旋转矩阵

    转自 https blog csdn net linuxheik article details 49129927 引用 四元组与旋转矩阵 2011 09 22 17 13 39 分类 DirectX资料 举报 字号 订阅 下载LOFTER
  • halcon起步

    halcon起步 安装 软件介绍 安装 下载地址 管理员方式运行 选择安装 否 复制dll文件 D Program Files MVTec HALCON 12 0 bin x64 win64 重启计算机 软件介绍 打开药品识别例程 导出为c
  • vue3报错:‘xxxx‘is declared but its value is never read.Vetur(6133)

    原因 因为vue3不支持vetur了 解决办法 1 禁用或者删除vscode中的vetur扩展 2 下载Vue Language Features 3 重新打开项目 完美解决
  • 医学图像相关的数据集

    医学图像相关的数据集 1 Camelyon 乳腺病理 数据集获取 参考 博文地址 相关文章推荐 预处理
  • Qt QString字符串分割、截取的3种方法

    Qt QString字符串分割 截取 在做项目中不可避免的会使用到一串字符串中的一段字符 因此常常需要截取字符串 有两种方式可以解决这个问题 方法一 QString分割字符串 QString date dateEdit toString y
  • Log4Net使用实例(VS2008 App)

    准备工作 首先要去http logging apache org log4net 下载log4net的源代码 将log4net sln载入Visual Studio NET 编译后可以得到log4net dll 也可以直接在网上搜索下载别人
  • CI/CD(持续集成/持续交付/持续部署)

    CICD流程图 代码管理仓库gitlab gitlab是个私有的代码管理仓库 可以运行在企业内部的网络中 使企业开发人员可以保持代码的私有性 同时也方便自行管理代码 gitlab有很多CI功能 但是通常还是采用Jenkins 原因就是Jen
  • 淘宝用户日志数据集的用户行为分析与用户分群

    文章目录 数据集描述 一 数据清洗 1 读取并查看数据基本信息和数据的完整性 2 查看数据集中行的重复情况并删除 3 处理缺失值 4 合并month和day列组成时间类型的date列 5 划分子数据集 二 数据分析 1 访问量与访客量的情况
  • 嵌入式开发4(I.MX6U串口实验与ubuntu串口调试助手)

    在学习正点原子6UL嵌入式开发板的时候 串口UART是一个很重要的点 在以后的实验中会经常遇到 但是教学中是在windows环境下搭建ubuntu虚拟机来编译代码的 串口调试助手使用的是windows版本的 而我是安装了双系统 所以研究了一
  • visual studio中配置OpenCVsharp

    只能在线下载 每次新建项目就要下载一次 没找到离线下载的方式 很可恶 visual studio2019 C 语言 配置OpenCVsharp当前最新版 4 6 0 在浏览界面搜索OpenCVsharp 下载OpenCVsharp4和对应r
  • unity 路径

    IOS Application dataPath Application xxxxxxxx xxxx xxxx xxxx xxxxxxxxxxxx xxx app Data Application streamingAssetsPath A
  • 使用 .net + blazor 做一个 kubernetes 开源文件系统

    背景 据我所知 目前 kubernetes 本身或者其它第三方社区都没提供 kubernetes 的文件系统 也就是说要从 kubernetes 的容器中下载或上传文件 需要先进入容器查看目录结构 然后再通过 kubectl cp 指令把文
  • linux系统 在python3.6/CUDA 11环境下安装tensorflow 1.15

    今天在实验室服务器 3090 上跑别人用tensorflow写的代码 CPU使用率飙高 吓得我赶紧停了QAQ 后来发现是因为GPU无法使用 其原因是官网中cuda11 X 仅支持tf2 X 不支持tf1 X 通过查阅资料 参考大佬的方法 最
  • 力扣-912题 排序数组(C++)- 快排必须烂熟于心

    题目链接 https leetcode cn com problems sort an array 题目如下 class Solution public vector
  • vue3中百度地图的使用

    在vue3中使用百度地图 vue3 百度地图 文章目录 在vue3中使用百度地图 前言 一 百度地图在vue3中的引入 二 页面内容 注意事项 三 异步加载文件 四 图 前言 具体为百度地图引入 如何使用点位和自定义点位信息窗口 提示 以下
  • 2015蓝桥杯——密文搜索

    题目描述 标题 密文搜索 福尔摩斯从X星收到一份资料 全部是小写字母组成 他的助手提供了另一份资料 许多长度为8的密码列表 福尔摩斯发现 这些密码是被打乱后隐藏在先前那份资料中的 请你编写一个程序 从第一份资料中搜索可能隐藏密码的位置 要考