题目链接:点击打开链接
哈希函数即一个N位的NC进制数
AC代码如下:
#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <set>
#include <cstring>
using namespace std;
int N, NC, pos;
int hash_c[260];
bool re[16000005];
string ss;
void hashCaculate()
{
pos=0;
memset(hash_c,-1,sizeof(hash_c));
for(int i=0;i<ss.length();++i)
{
if(hash_c[(int)ss[i]]==-1)
hash_c[(int)ss[i]]=pos++;
//cout<<hash_c[(int)ss[i]]<<endl;
}
}
unsigned long long power(unsigned long long a, unsigned long long n)
{
if(n==0) return 1;
if(n==1) return a;
unsigned long long temp = power(a,n/2);
if(n%2) return temp*temp*a;
else return temp*temp;
}
void solve()
{
memset(re,0,sizeof(re));
unsigned long long cnt=0;
for(int i=0;i<=ss.length()-N&&i+N<=ss.length();++i)
{
unsigned long long key = 0;
//cout<<hash_c[(int)ss[i]]<<endl;
for(int j=0;j<N;++j)
{
key+=hash_c[(int)ss[j+i]]*power(NC,j);
}
if(!re[key]) re[key]=true, cnt++;
}
cout<<cnt<<endl;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
while(cin>>N>>NC)
{
cin>>ss;
hashCaculate();
solve();
ss.clear();
}
return 0;
}