密文搜索
题目描述
福尔摩斯从 X 星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为 8 的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。
输入描述
- 第一行:一个字符串
s
,全部由小写字母组成,长度小于 1024×1024。 - 第二行:一个整数
n
,表示以下有n
行密码,1 ≤ n ≤ 1000
。 - 接下来
n
行,每行是一个字符串,均由小写字母组成,长度都为 8。
输出描述
输出一个整数,表示每行密码的所有排列在 s
中匹配次数的总和。
输入输出样例
输入
in
aaaabbbbaabbcccc
2
aaaabbbb
abcabccc
输出
out
4
c++代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
string str, s;
cin >> str;
int n, cont = 0;
cin >> n;
vector<string> mid;
while(n--) {
cin >> s;
sort(s.begin(), s.end());
mid.push_back(s);
}
for (int i = 0; i < str.size() - 7; i++) {
s = str.substr(i, 8);
sort(s.begin(), s.end());
for (string k : mid) {
if (k == s) cont++;
}
}
cout << cont;
return 0;
}//by wqs
题目解析
在字符串 s
中,用滑动窗口,每次取连续8个字符,判断是否能通过乱序排列组成密码,匹配就计数。