【蓝桥杯】2015决赛 密文搜索 (map)

题目描述

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

输入

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

输出

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

样例输入

aaaabbbbaabbcccc
2
aaaabbbb
abcabccc

样例输出

4

提示

第一个密码匹配了3次,第二个密码匹配了1次,一共4次。


代码:

因为密码可以全排列,那么只要出现过的字符次数和s中的某八位相同,就代表是一个答案。

#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
string s,t;
map<string,int> mp;
ll n,ans=0;
 
int main() 
{
    
    
	cin>>s>>n;

	for(int i=0;i<=s.size()-8;i++)
	{
    
    
		string x=s.substr(i,8); //每次切8个
		sort(x.begin(),x.end()); //排序
		mp[x]++; //记录出现次数
	}
	
	for(int i=0;i<n;i++)
	{
    
    
		cin>>t;
		sort(t.begin(),t.end()); //排序
		ans+=mp[t]; //加上出现过的次数
	}
	
	cout<<ans;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45260385/article/details/109406630