[蓝桥杯 2015 国 B] 密文搜索
题目描述
福尔摩斯从 X 星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为 8 8 8 的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。
输入格式
输入第一行:一个字符串 s s s,全部由小写字母组成,长度小于 1024 × 1024 1024 \times 1024 1024×1024。
紧接着一行是一个整数 n , n, n, 表示以下有 n n n 行密码, 1 ≤ n ≤ 1000 1 \le n \le 1000 1≤n≤1000。
紧接着是 n n n 行字符串,都是小写字母组成,长度都为 8 8 8。
输出格式
一个整数,表示每行密码的所有排列在 s s s 中匹配次数的总和。
样例 #1
样例输入 #1
aaaabbbbaabbcccc
2
aaaabbbb
abcabccc
样例输出 #1
4
提示
第一个密码匹配了 3 3 3 次,第二个密码匹配了 1 1 1 次,一共 4 4 4 次。
时限 3 秒, 512M。蓝桥杯 2015 年第六届国赛
思路
- 本道题求的是后面n个密码的排列在原串的匹配情况次数。
- 那我们不妨直接对输入的密码排列一下且放到map数组中去,然后从主串里面每次截取8个字符。(这里时间很充裕且数据规模不大)
- 交上上去的时间还可以。
代码
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
string a;
int n;
map<string,int>S;
int main(){
cin>>a>>n;
for(int i=0;i<n;i++){
string b;
cin>>b;
sort(b.begin(),b.end());
S[b]++;
}
int ans=0;
for(int i=0;i<a.size();i++){
string c=a.substr(i,8);
sort(c.begin(),c.end());
ans+=S[c];
}
cout<<ans;
return 0;
}