蓝桥杯第六届国赛JAVA真题----密文搜索
标题:密文搜索
福尔摩斯从X星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。
数据格式:
输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
紧接着是n行字符串,都是小写字母组成,长度都为8
要求输出:
一个整数, 表示每行密码的所有排列在s中匹配次数的总和。
例如:
用户输入:
aaaabbbbaabbcccc
2
aaaabbbb
abcabccc
则程序应该输出:
4
这是因为:第一个密码匹配了3次,第二个密码匹配了1次,一共4次。
资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗 < 5000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
思路:根据题意,我们一开始的思路是求解每行密码c的所有排列方式,然后与总的密文s进行逐个比较,记录匹配成功的次数。
而这个题目的巧妙之处在于:正因为需要求每行密码的所有排列在s中匹配次数的总和,所以我们可以直接统计每行密码中所包含各字母的个数,与长度为8的s子区间的各字母的个数进行比较。而且由于密码c的长度固定为8,所以我们只需在s中截取长度为8的区间,进行比较即可。而s中这样的区间刚好有s.length()-7个。
例如: 1 2 3 4 5 6 7 8 9 10 s长度为10
则长度为8的区间只有<1-8> <2-9> <3-10>,一共是10-7=3个。
(既然都要求全排列,那么也就是所有的排列方式都有可能,那实际上只需要计算各字母的个数就可以了,这里可能有点绕,仔细理解一下)
完整代码如下:
import java.util.Scanner;public class Main {static Scanner in = new Scanner(System.in);static String s;static String[] c = new String[1000];static int n;static int cnt = 0;public static void main(String[] args) {s = in.next();n = in.nextInt();for (int i = 1; i <= n; i++) {String c = in.next();String x = sum(c);for (int j = 0; j < s.length()-7; j++) {String con = s.substring(j, j+8);if (x.equals(sum(con))) {cnt++;}}}System.out.println(cnt);}/*** sum(String)函数用来求子串中的各字母个数,返回一个String* 思路:采用桶排序的排序方式,在记录下每个字母出现的次数时,这里注意由于比较的是字母,对应数组下标的的话是数字,要进行类似c.charAt(i)-'a'* 最后传出String方便比较,将int[]转换成String* */private static String sum(String c) {String result = "";int[] sum = new int[26];for (int i = 0; i <= c.length()-1; i++) {int index = c.charAt(i)-'a';sum[index]+=1;}/*** int[]->String* */for (int i = 0; i < sum.length; i++) {result += sum[i] + "";}return result;}
}
下面这种做法是借鉴的网上的,基本思路基本相同,区别在于下面这种方法是最后比较的是int[],而非String,代码量不如博主的少。在比赛中尽量避免繁琐的思路,代码越精简越好。
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n;String str = new String();String s = new String();int[][] a = new int[1005][26];int[] b = new int[26];str = in.next();for (int i = 0; i < str.length()-7; i++) {for (int j = i; j <= i+7; j++) {a[i][str.charAt(j)- 'a'] += 1;}}n = in.nextInt();int sum = 0;for (int k = 0; k < n; k++) {int flag = 0;for (int i = 0; i < b.length; i++) {b[i] = 0;}s = in.next();for (int i = 0; i < s.length(); i++) {b[s.charAt(i) - 'a'] += 1;}for (int i = 0; i < str.length()-7; i++) {flag = 1;for (int j = 0; j < 26; j++) {if (a[i][j] != b[j]) {flag = 0;break;}}if (flag == 1) {sum++;}}}System.out.println(sum);}
}
蓝桥杯第六届国赛JAVA真题----密文搜索相关推荐
- 蓝桥杯第六届国赛JAVA真题----切开字符串
标题:切开字符串 Pear有一个字符串,不过他希望把它切成两段. 这是一个长度为N(<=10^5)的字符串. Pear希望选择一个位置,把字符串不重复不遗漏地切成两段,长度分别是t和N-t(这两 ...
- 蓝桥杯第六届国赛JAVA真题----表格计算
标题:表格计算 某次无聊中, atm 发现了一个很老的程序.这个程序的功能类似于 Excel ,它对一个表格进行操作. 不妨设表格有 n 行,每行有 m 个格子. 每个格子的内容可以是一个正整数,也可 ...
- 蓝桥杯第六届国赛JAVA真题----奇怪的数列
标题:奇怪的数列 从X星截获一份电码,是一些数字,如下: 13 1113 3113 132113 1113122113 .... YY博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都 ...
- 蓝桥杯第七届国赛JAVA真题----平方末尾
平方末尾 能够表示为某个整数的平方的数字称为"平方数" 比如,25,64 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数. 因为平方数的末位只可能是:[0, 1, ...
- 蓝桥杯第六届省赛JAVA真题----生命之树
生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都 ...
- 蓝桥杯第六届省赛JAVA真题----垒骰子
垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...
- 蓝桥杯第七届国赛JAVA真题----机器人塔
机器人塔 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似: 队内的组塔规则是: A 只能站在 AA 或 BB 的肩上. B 只能站在 AB 或 BA 的肩上. ...
- 蓝桥杯第七届国赛JAVA真题----七星填数
七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...
- 蓝桥杯第六届省赛JAVA真题----打印菱形
打印菱形 给出菱形的边长,在控制台上打印出一个菱形来. 为了便于比对空格,我们把空格用句点代替. 当边长为8时,菱形为: .......* ......*.* .....*...* ....*.... ...
最新文章
- 2015年7月VIP内推前端工程师面试经历
- jquery 中 fn.apply(this, arguments)是什么函数?有什么作用?能举个例子吗
- 第十五节:有一种特殊的函数叫:Generator函数
- Thinkphp5内核大型程序员交流博客系统源码
- android studio开关控件,Android studio实现滑动开关
- twitter数据集_推特宠物数据整理及分析
- ipv4改完保存不成功_win7系统没法保存修改后IP地址的解决方法
- Illustrator 教程,如何在 Illustrator 中重新着色图稿?
- WPF入门教学(C#窗口、客户端)
- Centos 命令行添加VLAN TAG
- RV-LINK:将 GD32VF103C-START 开发板变成 RISCV-V 仿真器
- Win10 清理备用内存
- python决策树案例_决策树案例:基于python的商品购买能力预测系统
- 来了!中国IT就业市场,最景气的岗位非它莫属!
- htmla标签下划线去除_html超链接的下划线怎么去掉?a标签去下划线的方法都在这里...
- 动物 v.s. AI奥运会:你会赌一只鸟还是机器人夺冠?
- D21 LeetCode 2038.如果相邻两个颜色均相同则删除当前颜色(中等)
- 解决浏览器不支持display:flex的问题
- Sql Server 创建临时表
- 蓝天白云何在?国外的天空分外蓝,外国的月亮更加圆?真实与谎言
热门文章
- 世界手机号码格式_脑炎康复之旅——世界脑炎日病友征文
- python怎么安装request_【python】如何安装requests
- pandas输出到excel_学Python还不会处理Excel数据?带你用pandas玩转各种数据处理
- java基于ssm的个人博客系统_调研了 100 来个 Java 博客系统,发现这5个最好用
- python 模糊匹配_很冷门,但非常实用的 Python 库
- 数控机床需要c语言程序吗,数控机床编程与操作--详细介绍
- 【OpenCV 例程200篇】42. 图像的灰度变换(比特平面分层)
- php快废了,PHP为什么要逐渐废弃一些函数?出于什么原因呢?
- 【Linux】查看文件内容的相关命令总结
- 【转】Docker学习_本地/容器文件互传(5)