您的位置:首页 > 其它

POJ 1200 Crazy Search(哈希)

2017-09-11 22:13 555 查看
 题目链接:点击打开链接

哈希函数即一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: