题目描述
福尔摩斯从X星收到一份资料,全部是小写字母组成。他的助手提供了另一份资料:许多长度为8的密码列表。福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。
输入
输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
紧接着是n行字符串,都是小写字母组成,长度都为8
输出
一个整数, 表示每行密码的所有排列在s中匹配次数的总和。
样例输入 Copy
aaaabbbbaabbcccc 2 aaaabbbb abcabccc
样例输出 Copy
4
提示
第一个密码匹配了3次,第二个密码匹配了1次,一共4次。
主要是使用字符串容器 string 处理:
代码:
#include<stdio.h> #include<string.h> #include<map> #include<queue> #include<string> #include<stdlib.h> #include<math.h> #include<iostream> #include<algorithm> using namespace std; const int N=1024*1024+1; int n; map<string,int>mp; string h,a,s; int main() { cin>>s; scanf("%d",&n); for(int i=0;i<s.size()-7;i++) { string str=s.substr(i,8);//截取字符串中一部分 sort(str.begin(),str.end());//string 容器排序 mp[str]++; } int ans=0; for(int i=1;i<=n;i++) { cin>>a; sort(a.begin(),a.end()); ans+=mp[a]; } printf("%d\n",ans); }