poj 1200 hash

来源:互联网 发布:centos jdk rpm 编辑:程序博客网 时间:2024/04/30 08:43

瞄了别人的解法才会做 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;}  


1 0
原创粉丝点击