2015年第六届蓝桥杯CC++程序设计本科B组国赛 密文搜索(模拟)

    xiaoxiao2022-07-02  107

    标题:密文搜索

    福尔摩斯从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 <xxx>, 不能通过工程设置而省略常用头文件。

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

    解题思路:

    题意看了几遍才看懂,有时觉得英语学得不怎么好,可能其实中文学得也不那么好。。

    1.将原串s1按每8个分成一个个子串,统计每个字串中每个字母出现的次数。

    2.统计输入的密码串s2中每个字母出现的个数。

    3.在原串s1的所有子串中遍历找到字母出现个数相同的即sum++

     

    代码:

    #include<bits/stdc++.h> using namespace std; #define N 1024*1024+10 char s1[N],s2[10]; int a[N][26],b[26]; int main() { while(~scanf("%s",s1)) { memset(a,0,sizeof(a)); int len1=strlen(s1); for(int i=0;i<=len1-8;i++) { for(int j=i;j<i+8;j++) { a[i][s1[j]-'a']++;//以第i个字母开头的长度为8的字符串里字母出现的个数 } } int n,sum=0; scanf("%d",&n); while(n--) { scanf("%s",s2); memset(b,0,sizeof(b)); for(int i=0;i<8;i++) { b[s2[i]-'a']++; } for(int i=0;i<=len1-8;i++) { int flag=1; for(int j=0;j<26;j++) { if(a[i][j]!=b[j]) { flag=0; break; } } if(flag) sum++; } } printf("%d\n",sum); } return 0; }

     

    最新回复(0)