标题:密文搜索

福尔摩斯从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真题----密文搜索相关推荐

  1. 蓝桥杯第六届国赛JAVA真题----切开字符串

    标题:切开字符串 Pear有一个字符串,不过他希望把它切成两段. 这是一个长度为N(<=10^5)的字符串. Pear希望选择一个位置,把字符串不重复不遗漏地切成两段,长度分别是t和N-t(这两 ...

  2. 蓝桥杯第六届国赛JAVA真题----表格计算

    标题:表格计算 某次无聊中, atm 发现了一个很老的程序.这个程序的功能类似于 Excel ,它对一个表格进行操作. 不妨设表格有 n 行,每行有 m 个格子. 每个格子的内容可以是一个正整数,也可 ...

  3. 蓝桥杯第六届国赛JAVA真题----奇怪的数列

    标题:奇怪的数列 从X星截获一份电码,是一些数字,如下: 13 1113 3113 132113 1113122113 .... YY博士经彻夜研究,发现了规律: 第一行的数字随便是什么,以后每一行都 ...

  4. 蓝桥杯第七届国赛JAVA真题----平方末尾

    平方末尾 能够表示为某个整数的平方的数字称为"平方数" 比如,25,64 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数. 因为平方数的末位只可能是:[0, 1, ...

  5. 蓝桥杯第六届省赛JAVA真题----生命之树

    生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都 ...

  6. 蓝桥杯第六届省赛JAVA真题----垒骰子

    垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...

  7. 蓝桥杯第七届国赛JAVA真题----机器人塔

    机器人塔 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似: 队内的组塔规则是: A 只能站在 AA 或 BB 的肩上.     B 只能站在 AB 或 BA 的肩上. ...

  8. 蓝桥杯第七届国赛JAVA真题----七星填数

    七星填数 如图[图1.png]所示. 在七角星的14个节点上填入1~14 的数字,不重复,不遗漏. 要求每条直线上的四个数字之和必须相等. 图中已经给出了3个数字. 请计算其它位置要填充的数字,答案唯 ...

  9. 蓝桥杯第六届省赛JAVA真题----打印菱形

    打印菱形 给出菱形的边长,在控制台上打印出一个菱形来. 为了便于比对空格,我们把空格用句点代替. 当边长为8时,菱形为: .......* ......*.* .....*...* ....*.... ...

最新文章

  1. 2015年7月VIP内推前端工程师面试经历
  2. jquery 中 fn.apply(this, arguments)是什么函数?有什么作用?能举个例子吗
  3. 第十五节:有一种特殊的函数叫:Generator函数
  4. Thinkphp5内核大型程序员交流博客系统源码
  5. android studio开关控件,Android studio实现滑动开关
  6. twitter数据集_推特宠物数据整理及分析
  7. ipv4改完保存不成功_win7系统没法保存修改后IP地址的解决方法
  8. Illustrator 教程,如何在 Illustrator 中重新着色图稿?
  9. WPF入门教学(C#窗口、客户端)
  10. Centos 命令行添加VLAN TAG
  11. RV-LINK:将 GD32VF103C-START 开发板变成 RISCV-V 仿真器
  12. Win10 清理备用内存
  13. python决策树案例_决策树案例:基于python的商品购买能力预测系统
  14. 来了!中国IT就业市场,最景气的岗位非它莫属!
  15. htmla标签下划线去除_html超链接的下划线怎么去掉?a标签去下划线的方法都在这里...
  16. 动物 v.s. AI奥运会:你会赌一只鸟还是机器人夺冠?
  17. D21 LeetCode 2038.如果相邻两个颜色均相同则删除当前颜色(中等)
  18. 解决浏览器不支持display:flex的问题
  19. Sql Server 创建临时表
  20. 蓝天白云何在?国外的天空分外蓝,外国的月亮更加圆?真实与谎言

热门文章

  1. 世界手机号码格式_脑炎康复之旅——世界脑炎日病友征文
  2. python怎么安装request_【python】如何安装requests
  3. pandas输出到excel_学Python还不会处理Excel数据?带你用pandas玩转各种数据处理
  4. java基于ssm的个人博客系统_调研了 100 来个 Java 博客系统,发现这5个最好用
  5. python 模糊匹配_很冷门,但非常实用的 Python 库
  6. 数控机床需要c语言程序吗,数控机床编程与操作--详细介绍
  7. 【OpenCV 例程200篇】42. 图像的灰度变换(比特平面分层)
  8. php快废了,PHP为什么要逐渐废弃一些函数?出于什么原因呢?
  9. 【Linux】查看文件内容的相关命令总结
  10. 【转】Docker学习_本地/容器文件互传(5)