您的位置:首页 > 其它

子串问题-字符hash模板

2014-04-20 00:55 246 查看
这个字符hash是我模仿教主的写出来了,感觉只是把字符串转化成了数字,没有解决冲撞问题(爆unsigned long long)不过冲撞的可能比你中100万彩票的可能还小;

base表示进制,可以根据实际问题来修改,xp[i]表示base进制下的相应的位的十进制表示;

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn=100001;
const int base=27;

typedef unsigned long long ull;
ull Hash[maxn];
ull xp[maxn];

int main()
{
xp[0]=1;
for(int i=1;i<maxn;i++)
xp[i]=xp[i-1]*base;
string a;
cin>>a;
int L=a.length(),a_num=0;
for(int i=L-1;i>=0;i--)
a_num=a_num*base+a[i]-'a'+1;
string x;
cin>>x;
int len=x.length();
Hash[len]=1;
for(int i=len-1;i>=0;i--)
Hash[i]=Hash[i+1]*base+x[i]-'a'+1;
bool flag=false;
for(int i=0;i+L<=len;i++){
if(a_num==Hash[i]-Hash[i+L]*xp[L]){
printf("yes\n");
flag=true;
}
}
if(!flag)printf("no\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串 字符hash