子串问题-字符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;
}
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;
}
相关文章推荐
- Game (子串问题 模板)
- Game (子串问题 模板)
- Game (子串问题 模板)
- 字符子串问题
- Game (子串问题 模板)
- java实现字符串匹配问题之求两个字符串的最大公共子串
- 最长连续三字符子串问题
- 两个字符串hash问题:检查两个单词是否互为变位词和在一个字符串中第一个只出现一次的字符
- Game (子串问题 模板)
- Game (子串问题 模板)
- 去连续字符类似删除回文子串问题
- 字符常量与模板匹配问题
- 字符子串问题
- Game (子串问题 模板)
- 动态规划问题--最长公共子序列(LCS)问题--删除一些字符使得剩下的是一个回文子串
- Game (子串问题 模板)
- 递归问题之一:给定一字符串,输出字符串中所有字符子串的各种组合形式,长度为一个字符到字符串的长度,忽略排序
- 求字符串的不重复字符的最长子串长度的问题
- 从#65279字符看dede模板页面编码问题
- C/C++学习笔记32:字符串操作与字符子串问题