福尔摩斯从X星收到一份资料,全部是小写字母组成。
他的助手提供了另一份资料:许多长度为8的密码列表。
福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。
要考虑密码的所有排列可能性。
输入第一行:一个字符串s,全部由小写字母组成,长度小于1024*1024
紧接着一行是一个整数n,表示以下有n行密码,1<=n<=1000
紧接着是n行字符串,都是小写字母组成,长度都为8
一个整数, 表示每行密码的所有排列在s中匹配次数的总和。
aaaabbbbaabbcccc
2
aaaabbbb
abcabccc
4
第一个密码匹配了3次,第二个密码匹配了1次,一共4次。
因为密码可以全排列,那么只要出现过的字符次数和s中的某八位相同,就代表是一个答案。
#include
#include
#include
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;
}