瞄了别人的解法才会做 http://www.cnblogs.com/rainydays/archive/2011/06/23/2088081.html
hash题要想出合适的hash方法也是一个关键。
将字符串转变成数字串,如果知道了最多有n个字符串,就等于是数字最大不超过n,把字符串看做n进制,就可以每一个独一无二的数字串转变为一个独一无二的十进制数字。
#include<iostream>
#include<vector>
#include <string>
#include<algorithm>
#include<fstream>
#include<cmath>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define FORE(i,b,e) for(int i=b;i>=e;i--)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =16000007;
const int INF = 1000000000;
int tol,n,m,newn;
bool hashtable[maxnum];
char allstring[maxnum];
int toint[260],t=0;
int main()
{
/*string tmp;
fstream fin("G:/1.txt");
while(!fin.eof()){
fin>>n>>m;*/
while(scanf("%d%d",&n,&m)!=EOF){
tol=0;
ms(hashtable);ms(allstring);ms(toint);
scanf("%s",allstring);/*
fin>>tmp;*/
int num=strlen(allstring);
FOR(i,0,num-1){
if(toint[allstring[i]]==0)
toint[allstring[i]]=++t;
}
int sum=0,maxsum=m;
FOR(i,0,n-2){
sum=sum*m+toint[allstring[i]];
maxsum*=m;//求出hash出的最大值
}
FOR(i,n-1,num-1){
sum=(sum*m+toint[allstring[i]])%maxsum;//取余去掉最高位
if(!hashtable[sum]){
tol++;
hashtable[sum]=1;
}
}
printf("%d\n",tol);
}
return 0;
}