题目描述
福尔摩斯从X星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。
要考虑密码的所有排列可能性。
输入
输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
紧接着是n行字符串,都是小写字母组成,长度都为8
输出
一个整数, 表示每行密码的所有排列在s中匹配次数的总和。
样例输入
aaaabbbbaabbcccc
2
aaaabbbb
abcabccc
样例输出
4
提示
第一个密码匹配了3次,第二个密码匹配了1次,一共4次。
解题思路:
因为密码可以随机排列(全排列),故只要密码各个字母出现的次数与原字符串某连续8位各个字母出现的次数相同就代表一个答案。
代码如下:
#include <iostream>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
map<string, int>mp;int main() {int n;string s;cin >> s >> n;for (int i = 0; i <= s.length() - 8; i++) {string str = s.substr(i, 8);//每次截取8位sort(str.begin(), str.end());//排序mp[str]++;}int ans = 0;for (int i = 0; i < n; i++) {string b;cin >> b;sort(b.begin(), b.end());//排序ans += mp[b];//加上原字符串中符合这个密码的全部情况}cout << ans << endl;return 0;
}