第一次涉及HASH查找的知识
对于字符串的查找有很多前人开发出来的HASH函数,比较常用的好像是ELF 和 BKDR。
这道题没想到突破点是在于其nc值,告诉你组成字符串的字母种类。
还有用26进制,不管怎么说,只要避免产生冲突,怎么哈希都行。
用的是BKDRHash法。
#include <iostream> #include <cstdio> #include <cstring> #define maxn 20000000 #define mm 1000000 using namespace std; int hash[maxn]={0}; char str[mm]; int news[mm]={0}; int ans; int n,nc; int BKDRHash(char *key) { int seed=nc; int p=0; //cout<<"pass"; while (*key) { p=p*seed+(news[(*key++)-'a']); } return (p & 0x7FFFFFFF); } void hashit (char *s) { //memset(hash,0,sizeof hash); int i,j,k; char ch[mm]; for (i=0;s[i+n-1];i++) { for (j=0;j<n;j++) ch[j]=s[i+j]; ch[j]='