poj3007
来源:互联网 发布:gitlab windows server 编辑:程序博客网 时间:2024/06/15 00:47
转载自:http://www.cnblogs.com/jiu0821/p/4554352.html
求一个字符串的hash值:
假设我们取p=13 ,mod=101
先把abc映射为一个整数
hash[0]=1,表示 a 映射为1
hash[1]=(hash[0]*p+idx(b))%mod=15,表示 ab 映射为 15
hash[2]=(hash[1]*p+idx(c))%mod=97
这样,我们就把 abc 映射为 97 这个数字了。
hash值呢?
unsigned long long hash[N];
定义一个unsigned long long类型的变量,它的范围是在[0, 2^64) 内,这就相当于,当数超不过2^64-1后,它会溢出!这就相当于一个数模2^64的过程。
那么hash函数可以理解为:
hash[i]=(hash[i-1]*p)%(2^64)
P取一个大素数,一般习惯取1e9+7或1e9+9
安全指数:三星(所以并不是很安全)
这个之前已经提到过了。
hash[i]=(hash[i-1]*p+idx(s[i]))%mod
hash1[i]=(hash1[i-1]*p+idx(s[i]))%mod1
hash2[i]=(hash2[i-1]*p+idx(s[i]))%mod2
pair<hash1,hash2>表示一个字符串!
解释:
hash1[i]=(hash1[i-1]*p+idx(s[i]))%mod1
hash2[i]=(hash2[i-1]*p+idx(s[i]))%mod2
mod1一般取1e9+7,mod2一般取1e9+9为什么这么取?
1000000007和1000000009是一对孪生素数,取它们,冲突的概率极低!
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<set>
#define debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
typedef long long ll;
const int mod=1e9+7;
char a[105],b1[105],b2[105],t[10];
int len,ans;
set<ll> s;
void pan(char *b1,char *b2)
{
ll key=0;
int len1=strlen(b1),len2=strlen(b2);
for (int i=0;i<len1;i++) key=(key*29+(b1[i]-'a'+1))%mod;
for (int i=0;i<len2;i++) key=(key*29+(b2[i]-'a'+1))%mod;//字符串hash
if (s.count(key)==0) ans++,s.insert(key);//set判断是否已经出现
}
void rev(char *a)
{
int len=strlen(a);
char b;
for (int i=0;i<len/2;i++)//注意这里旋转,是要转前半部分,后部分如果再转就转回来了
{
b=a[i];a[i]=a[len-i-1];a[len-i-1]=b;
}
}
void work()
{
s.erase(s.begin(),s.end());//set的清空方式
ans=0;
scanf("%s",a);
len=strlen(a);
pan(t,a);
for (int i=1;i<len;i++)
{
memset(b1,0,sizeof(b1));
memset(b2,0,sizeof(b2));//char数组清空
for (int j=0;j<i;j++) b1[j]=a[j];
for (int j=i;j<len;j++) b2[j-i]=a[j];
rev(b2);pan(b1,b2);
rev(b1);pan(b1,b2);
rev(b2);pan(b1,b2);
rev(b1);
pan(b2,b1);
rev(b1);pan(b2,b1);
rev(b2);pan(b2,b1);
rev(b1);pan(b2,b1);
}
printf("%d\n",ans);
}
int main()
{
int T;
scanf("%d",&T);
while (T--) work();
return 0;
}
- poj3007
- POJ3007
- poj3007
- poj3007(模拟)
- ELF hash算法:poj3007
- POJ3007--Organize Your Train part II
- POJ3007 Organize Your Train part II
- poj3007--Organize Your Train part II(hash)
- Organize Your Train part II-POJ3007模拟
- poj3007 Organize Your Train part II, 字符串hash
- 字符串hash判重/trie树判重(poj3007)
- poj3007 Organize Your Train part II(字典树)
- (POJ3007)Organize Your Train part II <reverse函数/ hash / STL>
- OpencV使用fitEllipse拟合椭圆后,获取椭圆参数
- centos 7安装怎么没有界面,解决办法
- 精简阿里云短信服务官方SDK及DEMO
- Activity启动模式图文详解:standard, singleTop, singleTask 以及 singleInstance
- LeetCode 463. Island Perimeter
- poj3007
- 白话 P-value 这个再通俗不过了~
- Hibernate 执行普通的sql语句,并将结果封装成DTO对象
- FZU-1548 猪数
- 当当网畅销书排行爬虫(requests+BeautifulSoup)
- angular-ui-select 支持搜索的 下拉选择框 的使用
- Android中的内存泄漏情况分析
- 4.3注册一个工具窗口
- 学习随笔(1)ObjectInputStream与ObjectOutputStream装饰器