历届题目 密文搜索

题目描述

福尔摩斯从X星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。

输入

输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
紧接着是n行字符串,都是小写字母组成,长度都为8

输出

一个整数, 表示每行密码的所有排列在s中匹配次数的总和。

样例输入

aaaabbbbaabbcccc
2
aaaabbbb
abcabccc
样例输出
4

分析

把字符串每8个每8个字符的扫描,每一次扫描利用函数substr()存入一个字典中,存入之前要排序。
然后遍历n个字符串,记录结果

代码

#include <string>
#include <string.h>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <map>
#define inf 100000
using namespace std;
map<string, int> st;
int main(){
	string s = "";
    cin >> s;
    int n = s.length();
    for(int i = 0; i + 7 < n; i++){
    	string t = s.substr(i, 8);
    	sort(t.begin(), t.end());
    	st[t]++;//set长度为8的子串
	}
    cin >> n;
    int ans = 0;
    while(n--){
        cin >> s;
        sort(s.begin(), s.end());
        ans += st[s];
    }
    cout << ans << endl;
}



posted @ 2019-05-11 20:32  阳离子  阅读(350)  评论(0编辑  收藏  举报