这道题的关键是要看懂题意:“这些密码是被打乱后隐藏在先前那份资料中的”,“都是小写字母组成,长度都为8 ”,“要考虑密码的所有排列可能性”
思路:
- 把原字符串,每8个字母统计一下个数,存进一个数组
- 当输入n组字符串时,统计每一个字符串中字母的个数,然后和存储的字符串进行比较,如果字母个数相同,计数器+1就行
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e6+1e5;
int q[maxn][30];
int main()
{
string s;
cin>>s;
memset(q,0,sizeof(q));
for(int i=0; i<s.size(); i++)
{
if(i+7<s.size())
{
for(int j=i; j<=i+7; j++) ///每8个字母存一起
{
int x=s[j]-'a';
q[i][x]++;
}
}
}
int n;
int ans=0;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
string ss;
cin>>ss;
int num[30];
memset(num,0,sizeof(num));
for(int p=0; p<ss.size(); p++)
{
int x=ss[p]-'a';
num[x]++;
}
for(int j=0; j<=s.size()-8; j++)
{
int flag=1;
for(int k=0; k<26; k++)
{
if(num[k]!=q[j][k])
{
flag=0;
break;
}
}
if(flag==1) ans++;
}
}
printf("%d\n",ans);
}