密文搜索--第六届蓝桥杯国赛真题

xiaoxiao2021-02-27  207

标题:密文搜索 福尔摩斯从X星收到一份资料,全部是小写字母组成。 他的助手提供了另一份资料:许多长度为8的密码列表。 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。 请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。 数据格式: 输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024 紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000 紧接着是n行字符串,都是小写字母组成,长度都为8 要求输出: 一个整数, 表示每行密码的所有排列在s中匹配次数的总和。 v例如: 用户输入: aaaabbbbaabbcccc 2 aaaabbbb abcabccc 则程序应该输出: 4 这是因为:第一个密码匹配了3次,第二个密码匹配了1次,一共4次。 资源约定: 峰值内存消耗(含虚拟机) < 512M CPU消耗  < 5000ms 请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。 所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。

注意:主类的名字必须是:Main,否则按无效代码处理。

思路:全排列密码,然后在第一个字符串中查找即可。注意去重。

忘记了kmp算法怎么实现的~~只好用个改进前的~~

package 总决赛; import java.io.*; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.Scanner; public class 密文搜索 { static int num = 0; static boolean vis[]; static char[]y;//母串 static HashSet<String>hs = new HashSet<String>(); static boolean is_in(char []y,char[]a){//a是否在y里 int i=0; for(int x=0;x<a.length;x++){//改进前的kmp算法。。 if(i >= y.length) { return false; } if(y[i] == a[x]) { i++; } else{ i = i+1-x; x = -1; } } return true; } static void dfs(char []y,char[]c,char []a,int d){//全排c,全排后结果为a和y比较,y中有a,放进HashSet中 if(d == c.length){ //判断a是否在y中 if(is_in(y,a)) { num++; hs.add(String.valueOf(a)); } return; } for(int i=0;i<c.length;i++){ if(!vis[i]) { a[d++] = c[i]; vis[i] = true; dfs(y,c,a,d); vis[i] = false; d--; } // else continue; } } public static void main(String[] args) { // TODO Auto-generated method stub Scanner s = new Scanner(System.in); String m = s.next(); y = m.toCharArray();//母串 int n = s.nextInt();//有n行密码 String[]z = new String[n]; for(int i=0;i<n;i++) { z[i] = s.next(); } for(int i=0;i<n;i++){ char []c = z[i].toCharArray(); vis = new boolean[c.length]; for(int j=0;j<c.length;j++) { vis[j] = false; } dfs(y,c,new char[c.length],0); } System.out.println(hs.size()); } }

转载请注明原文地址: https://www.6miu.com/read-11410.html

最新回复(0)