蓝桥杯 密文搜索

来源:互联网 发布:网络教育入学考试 编辑:程序博客网 时间:2024/06/13 09:57




标题:密文搜索


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


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



思路:还算水题吧, 注意到给的是8位密码,问八位密码所有的全排列在给定的1e6的匹配串里有几个。。那就on扫过匹配串,给每个8位排个序,记在map里,(因为密码是随意变得,所以只要他们含有相同字符就一定能变成。。。怎么判断是不是都有呢,那就排个序就好啦

代码:


#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#include <map>using namespace std;const int maxn = 2e6 + 5;map<string, int> m;char str[maxn];int main(){    while(~scanf(" %s", str))    {        int t;        scanf("%d", &t);        int len = strlen(str);        for(int i = 0; i+7 < len; i++)        {            string s;            for(int j = i; j < i+8; j++)                s += str[j];            sort(s.begin(), s.end());            m[s]++;        }        int ans = 0;        string s;        while(t--)        {            cin >> s;            sort(s.begin(), s.end());            ans += m[s];        }        printf("%d\n", ans);    }    return 0;}


原创粉丝点击