![](https://i-blog.csdnimg.cn/blog_migrate/eec16d7b188401712866572aebe48dcd.png)
我们知道密码是无序的,可以随机排列,因此排列问题成了组合问题,用哈希处理原字符串中每八个相邻字符,和密码,在做比较我们可以得到长为 strlen(s)-7和n的数组,将此问题变成数对问题。
#include<stdio.h>
#include<string.h>
int a1[1100000],a2[1001];
char aa[1100000];
void quick(int a[],int x,int y)
{
int i,j;
i=x;j=y;
int t=a[x];
while(i<=j)
{
while(a[i]<t) i++;
while(a[j]>t) j--;
if(i<=j)
{
int m=a[i];
a[i]=a[j];
a[j]=m;
i++;
j--;
}
}
if(x<j) quick(a,x,j);
if(i<y) quick(a,i,y);
}
int main()
{
int num=0,i,r,ls;
char c[10];
scanf("%s\n",aa+1);
ls=strlen(aa+1);
for(int i=1;i<=8;i++)
{
a1[i]=a1[i-1]+aa[i]*aa[i]*aa[i];
}
for(i=9;i<=ls;i++)
{
a1[i]=a1[i-1]+aa[i]*aa[i]*aa[i]-aa[i-8]*aa[i-8]*aa[i-8];
}
scanf("%d\n",&num);
for(int i=1;i<=num;i++)
{
scanf("%s",c+1);
for(int j=1;j<=8;j++)
{
a2[i]+=c[j]*c[j]*c[j];
}
}
quick(a1,1,ls);
quick(a2,1,num);
i=0,r=1;
int numi,numr,ans=0;
while(i<=num)
{
numi=1;
numr=0;
i++;
while(a2[i]==a2[i+1])
{
i++;
numi++;
}
while(r<=ls&&a1[r]<a2[i]) r++;
while(r<=ls&&a1[r]==a2[i])
{
r++;
numr++;
}
ans+=numi*numr;
}
printf("%d\n",ans);
return 0;
}
vscode快捷键
1. alt + shift + ↑/下 --> 快速复制当前行
2. 标签名*X --> x为数字,快速生成x个标签. p*3+回车:
<p></p>
<p></p>
<p></p>
3. 标签名{} --> 生成一个标签.大括号里面的为内容 p{多喝热水}
![](https://i-blog.csdnimg.cn/blog_migrate/547a8499ff44a940fee19a3b613bc59a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/eb8f120e5f580ed0e0a074191028aa15.png)
4. 标签名[] --> 生成一个标签.中括号里面的为标签属性
![](https://i-blog.csdnimg.cn/blog_migrate/07b26451f6d62b790f64ae69a642a89e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/06c247234709a29b9a304614a11ec2a8.png)
5. $ --> 一个变量.从1到X p{...$....}*10
![](https://i-blog.csdnimg.cn/blog_migrate/c4d7e3020fcaececfcf9cd99cde240a6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d7bb6ff338adaf827c4eab5d62fd8e25.png)
6. 快速生成一个包裹标签: ul>li*3 --> ul里面包裹了3个li标签
![](https://i-blog.csdnimg.cn/blog_migrate/903c43b9fbc96e4b7fd435ddb1d355d8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f0e7be5cc6123a7160e7c1a29bc6c742.png)