P8630 [蓝桥杯 2015 国 B] 密文搜索

news2025/1/12 9:40:27

题目描述

福尔摩斯从 X 星收到一份资料,全部是小写字母组成。

他的助手提供了另一份资料:许多长度为 88 的密码列表。

福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。

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

输入格式

输入第一行:一个字符串 ss,全部由小写字母组成,长度小于 1024 \times 10241024×1024。

紧接着一行是一个整数 n,n, 表示以下有 nn 行密码,1 \le n \le 10001≤n≤1000。

紧接着是 nn 行字符串,都是小写字母组成,长度都为 88。

输出格式

一个整数,表示每行密码的所有排列在 ss 中匹配次数的总和。

输入输出样例

输入 #1复制

aaaabbbbaabbcccc
2
aaaabbbb
abcabccc

输出 #1复制

4

说明/提示

第一个密码匹配了 33 次,第二个密码匹配了 11 次,一共 44 次。

时限 3 秒, 512M。蓝桥杯 2015 年第六届国赛

1.这个题目用的是hash算法。

2.题目的意思是吧密码打乱,也就是说重新排列,得到新的一串字符串,然后在母串当中寻找该子串。在母串找的时候必须是连续的8个。

3.那我们如何使用hash函数? 我们知道hash函数能够使相同的字符串得出的值相等,那么,如果,字符串里面的字符相对应是相等的,我们要是的通过hash函数使得他们相等:

让这俩个字符串相等,我们可以利用字符对应的ASCII码来做一个hash值,这样的话,如果相对于字符串的全排列,那样子hash函数 得出的值会是一样的。

如果设计我刚开始设计的是让ASCII码值    乘以   字符在字母表的顺序,但是只AC了四个测试点,我们可以改为平方法。乘以俩个ASCII码值。

 

4.然后就是一些细节:我们处理母串时,每8个生成一个hash值,然后排序即可。最后拿密码串去查找对应的hash值。排序建议使用快排,查找建议使用二分。

C代码如下:

#include<stdio.h>
#include<string.h>
#define N 1050000
char s[N];
int hash[N];
int n,c[27],m;
int quicksort(int left,int right)
{
	if(left>=right) return 0;
	int i=left,j=right,t,temp=hash[left];
	while(i<j)
	{
		while(i<j&&hash[j]>=temp) j--;
		while(i<j&&hash[i]<=temp) i++;
		if(i<j)
		{
			t=hash[i];hash[i]=hash[j];hash[j]=t;
		}
	}
	hash[left]=hash[i];
	hash[i]=temp;
	quicksort(left,i-1);
	quicksort(i+1,right);
}
int chazhao(int left,int right,int x)
{
	if(left>right) return -1;
	if(hash[left]==x) return left;
	if(hash[right]==x) return right;
	int mid=(left+right)/2;
	if(hash[mid]==x) return mid;
	else if(hash[mid]>x) chazhao(left,mid-1,x);
	else chazhao(mid+1,right,x);
}
int csh()
{
	int i,j;
	for(i=0;i<8;i++)
	{
		hash[0]+=(s[i]-'a'+1)*s[i]*s[i];
	}
	j=1;
	for(i=8;s[i];i++)
	{
		hash[j]=hash[j-1]-(s[i-8]*s[i-8]*(s[i-8]-'a'+1))+(s[i]-'a'+1)*s[i]*s[i];
		j++;
	}
	n=j;
}
int hsh(char t[])
{
	int i,k=0,j,sum=0;
	for(i=0;i<8;i++)
	{
		k+=(t[i]-'a'+1)*t[i]*t[i];
	}
	j=chazhao(0,n-1,k);
//	printf("j %d k%d",j,k);
	if(j==-1) return 0;
	for(i=j-1;i>=0&&hash[i]==k;i--)sum++;
	for(i=j+1;i<n&&hash[i]==k;i++) sum++;
	//printf("%d ",sum);
	return sum+1;
}
int main()
{
	int i;
	char t[10];
	long long sum=0;
	scanf("%s",s);
	csh();
	quicksort(0,n-1);
//	for(i=0;i<n;i++) printf("%d ",hash[i]);
	scanf("%d",&m);
	for(i=0;i<m;i++)
	{
		scanf("%s",t);
		sum+=hsh(t);
	}
	printf("%lld",sum);
}

C++代码为:

#include<iostream>
#include<cstring>
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
const int N=1050000;
char s[N];
int hashz[N];
int n,m;
int cmp(int a,int b)
{
	return a>b;
}
int csh()
{
	int i,j;
	for(i=0;i<8;i++)
	{
		hashz[0]+=(s[i]-'a'+1)*s[i]*s[i];
	}
	j=1;
	for(i=8;s[i];i++)
	{
		hashz[j]=hashz[j-1]-(s[i-8]*s[i-8]*(s[i-8]-'a'+1))+(s[i]-'a'+1)*s[i]*s[i];
		j++;
	}
	n=j;
}
int hsh(char t[])
{
	int i,k=0,j,sum=0;
	for(i=0;i<8;i++)
	{
		k+=(t[i]-'a'+1)*t[i]*t[i];
	}
	j=lower_bound(hashz,hashz+n-1,k)-hashz;
	for(i=j;i<n&&hashz[i]==k;i++) sum++;
	return sum;
}
int main()
{
	int i;
	char t[10];
	long long sum=0;
	cin >> s;
	csh();
	sort(hashz,hashz+n-1,cmp);
	cin >> m;
	for(i=0;i<m;i++)
	{
		cin >> t;
		sum+=hsh(t);
	}
	cout << sum << endl;
	return 0;
}

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

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

相关文章

八大排序算法(C语言实现)

文章目录&#xff1a;1.排序的概念2.常见八大排序算法3.插入排序3.1直接插入排序3.2希尔排序4.选择排序4.1直接选择排序4.2.堆排序5.交换排序5.1冒泡排序5.2快速排序5.2.1快排递归实现5.2.1.1Hoare法&#xff08;霍尔法&#xff09;5.2.1.2挖坑法5.2.1.3双指针法5.2.2快排迭代实…

最火的聊天回复神器

客服高效回复容易收获用户的好感&#xff0c;也更容易将客户转化成功&#xff0c;借助聊天回复神器&#xff0c;可以助力客服高效快捷地回复。 前言 经常网购的用户&#xff0c;一定会发现在联系客服咨询产品相关问题时&#xff0c;刚把问题发出去&#xff0c;马上就可以收到客…

three.js入门-一些基础理论|大帅老猿threejs特训

前言 参加了threejs直播课。 本篇文章为入门理论部分笔记。 可以学到什么&#xff1a; 一、软能力 1. 系统全流程理解web3D 应用/数字孪生/元宇宙&#xff0c;程序开发与3D美术资源制作 2. 建立与3D美术团队良好沟通协作能力 3. 良好把控3D画面效果和性能平衡 4. 培养程…

数据分析师:星图Stagraph 2.1 Crack

Stagraph 是一个用于数据导入 - 数据整理 - 数据可视化的复杂软件工具。面向数据工程师、数据分析师、数据科学家、统计学家和其他“数据专业人员”的专业软件。在简单易用的可视化界面中提供最新数据科学工具的强大功能。采集 by Ω578867473 降低 降低处理数据的复杂性。使用…

作业帮:探索多云架构下的数据库集群解决方案

导语&#xff1a;面对业务多元、数据海量、数据库种类多样、多云架构复杂等痛点&#xff0c;该如何制定既能解决问题又能降本增效的数据库升级方案&#xff1f;作业帮作为实践者&#xff0c;从四方面分享其数据库选型过程与思考。以下为作业帮DBA刘强在DTCC大会中的讲述。 嘉宾…

移动端自动化python使用appium包登录qq

听标题挺高大上的&#xff0c;其实内容还是脚本小子的高度。。。 为了写个月报一下午抓紧学点东西&#xff0c;好凑点字数&#xff0c;汗。。。 为啥学这个内容&#xff0c;因为找内容的时候翻csdn翻到一个自动抢红包的&#xff0c;就是用的这个技术&#xff0c;前面实验挺好&a…

React Native 三端同构在雪球的实践

随着移动互联网的迅猛发展&#xff0c;目前市面上「端」的形态多种多样&#xff0c;iOS、Android 、H5、微信小程序等各种端大行其道&#xff0c;同一个业务需求往往又需要在多端上去实现&#xff0c;针对不同端去编写多套代码的成本显然非常高。雪球大前端团队将今年在跨端能力…

提取DC综合report_constrain all violator中big neg slack

问题描述 在综合前几版中&#xff0c;通过report_constrain -all_violator命令到得到的违反数量非常多&#xff0c;但暂时只关注比较大的setup/hold违例。 &#xff08;1&#xff09;我们希望提取 < -1.0的违例 &#xff08;2&#xff09;需要把多行合并到一行。 &#xf…

学习python,我使用代码悄悄集齐了五福~哎嘿嘿

啊哈哈哈哈&#xff0c;我又又又来啦 这不是快春节了吗&#xff0c;支付宝等一些集五福活动又又又又一次的到来 今天呢&#xff0c;写一个啥呀我也不晓得&#xff0c;啊哈哈哈哈哈 今天写一个%90会出敬业福哦&#xff0c;啊哈哈哈哈 1.制作文字福 这个其实挺“简单”的&…

如何计算单元测试的覆盖率

一、概念 单元测试的覆盖率有&#xff1a;语句覆盖率&#xff08;即行覆盖率&#xff09;、分支覆盖率、条件覆盖率、分支条件覆盖率、路径覆盖率等。 语句覆盖率 所谓语句就是那些非分支、非判断的语句。 计算公式&#xff1a;程序执行到的语句总数 / 全部语句的总数 分支覆…

C语言程序设计易混、易错知识点(中篇)

注&#xff1a;个别题目未给ABCD&#xff0c;只需要了解知识点即可&#xff1b;另外排版可能有点乱&#xff0c;望知悉 在printf中的%作为转义符&#xff0c;两个%才相当于1个% free掉一个指针后&#xff0c;指针的值是不会自动置为NULL的&#xff0c;当然其指向的内存已经被释…

C语言从入门到放弃——字符串和内存操作函数

字符串&#xff0c;是一种由双引号引起的一整串字符&#xff0c;在C语言中&#xff0c;字符串是没有类型的&#xff0c;通常我们将字符串放在字符数组当中&#xff0c;同时&#xff0c;我们对于字符串的操作是很频繁的&#xff0c;因为对于字符串的操作频繁&#xff0c;所以C语…

为什么需要预选器?

无论是采用模拟IF处理的传统频谱仪&#xff0c;还是采用数字IF处理的现代频谱仪&#xff0c;都是扫频式架构&#xff0c;通过第一级本振(LO)的调谐实现射频的扫频测试。熟悉频谱仪架构的朋友都了解&#xff0c;在第一级混频器之前都会存在一个预选器&#xff0c;如图1所示&…

点成分享|器官芯片——小白鼠的拯救者?

在新药研发的漫长过程中&#xff0c;实验动物模型是药物从临床前试验阶段进入到临床试验阶段的金标准。实验动物模型有助于人们了解疾病的起源、病理生理特征、疾病机制、识别药物靶标、评估新药物的疗效和人体毒性以及进行药代动力学评价等。常用的实验动物模型包括小鼠、大鼠…

黑马学ElasticSearch(七)

目录&#xff1a; &#xff08;1&#xff09;RestClient查询文档-快速入门 &#xff08;2&#xff09;RestClient查询文档-match、term、range、bool查询 &#xff08;3&#xff09;RestClient查询文档-排序和分页 &#xff08;4&#xff09;RestClient查询文档-高亮显示 &…

git版本回退(git reset、git revert、git stash)

文章目录回退的两种情况1.已 commit&#xff0c;未push到远程仓库。git reset --soft &#xff08;撤销commit&#xff09;git commit --amend&#xff08;修改commit 提交的内容&#xff09;git reset --mixed&#xff08;撤销 commit 和 add 两个动作&#xff09;2.已 commit…

联合证券|左手消费,右手TMT!超270只股票新年获“买入”“推荐”

2023年开年A股商场交投继续火热&#xff0c;出资组织在活跃呼吁出资者布局的一起&#xff0c;自己又更加看好哪些标的和赛道&#xff1f; Wind数据显现&#xff0c;2023年头&#xff0c;券商关于大消费、TMT等方向装备价值更为喜爱&#xff0c;到1月10日&#xff0c;给予“买入…

LOAM、LEGO-LOAM与LIO-SAM的知识总结

文章目录LOAM、LEGO-LOAM与LIO-SAM的知识总结1.概要2.传感器信息读取3.数据的预处理4.激光雷达里程计4.1特征点提取4.2特征点关联匹配4.2.1 标签匹配4.2.2 两步LM优化4.2.3 LIO-SAM优化4.2.3.1 IMU预积分4.2.3.2 关键帧的引入4.2.3.3 因子图4.2.3.4 GPS因子4.2.3.5 回环因子5. …

代码随想录算法训练营第十五天字符串 java : 层序遍历 226.翻转二叉树 101. 对称二叉树

文章目录前言Leetcode 102 二叉树的层序遍历题目讲解Leetcode 226.翻转二叉树题目讲解Leetcode 101. 对称二叉树题目讲解递归法总结前言 递归三定律 确定参数和返回值确认终止条件确认单层递归的逻辑 Leetcode 102 二叉树的层序遍历 题目讲解 /*** Definition for a binar…

大批量数据需要导出导入时,使用mysql 快速导出和导入 csv

使用MYSQL命令行模式 导出into outfile 导入load data导出 into outfile&#xff1a;mysql> select * from cdkeyduihuan into outfile d:/cdk.csv FIELDS TERMINATED BY ,;Query OK, 1049990 rows affected (1.16 sec)d:/cdk.csv 导出数据保持的文件目录。FIELDS TERMINATE…