POJ 1200 Crazy Search(哈希)

来源:互联网 发布:js闭包的理解 编辑:程序博客网 时间:2024/06/08 08:30

 题目链接:点击打开链接

哈希函数即一个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;}