一道经典的hash字符串的题目,采用ull自然溢出
日后填坑
/*
* @Description:
* @Autor: Kadia
* @Date: 2020-07-12 19:33:51
* @LastEditors: Kadia
* @Connect: vx:ccz1354 qq:544692713
* @LastEditTime: 2020-07-18 17:30:10
*/
#include <bits/stdc++.h>
using namespace std;
unsigned long long p=13331;
unsigned long long MOD=18446744073709551615;
int check(int vis[30],int vis2[30])
{
for(int i=97;i<=122;i++)
{
if(vis[i]!=vis2[i])
return false;
}
return true;
}
unsigned long long ksm(unsigned long long x,int y,unsigned long long m)
{
if(y==0)
return 1;
unsigned long long t=ksm(x*x%m,y/2,m)%m;
if(y&1)
t=t*x%m;
return t;
}
unsigned long long hashnow1[200005];
unsigned long long *hashnow;
int vis1[300];
int vis2[300];
int main()
{
ios::sync_with_stdio(false);
hashnow=&hashnow1[1];
string s1,s2;
cin >> s1 >> s2;
int len1=s1.size();
int len2=s2.size();
for(int i=0;i<len1;i++)
vis1[s1[i]]++;
unsigned long long cc=ksm(p,len1,MOD);
map<unsigned long long,int>save;
int cnt=0;
for(int i=0;i<len2;i++)
{
vis2[s2[i]]++;
hashnow[i]=hashnow[i-1]*p+s2[i];
if(i-len1+1<0)
continue;
if(check(vis1,vis2)&&!save[(hashnow[i]-hashnow[i-len1]*cc)%MOD])
{
save[hashnow[i]-hashnow[i-len1]*cc]++;
cnt++;
}
vis2[s2[i-len1+1]]--;
}
cout << cnt << endl ;
return 0;
}