Hdu 1381 Crazy Search

Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1381

 

此题可以用哈希数组求解,至于什么是哈希,可以先看以下这篇推荐文章,写得挺不错的。

推荐:http://www.cnblogs.com/yangecnu/p/Introduce-Hashtable.html#undefined

首先是求key值,我采取了,求余法。

1
key = value mod p

 

接着是确定value与p的值。

p的值根据可能的组合数进行确定。

而value的值,为采取了如下方法,假设子串长度为N,那么

1
2
3
4
5
6
int value = 0;
int tmp = 1;
for( int i=0; i<N; i++ ) {
    value = ( c[i]-'a'+1 ) * tmp;
    tmp = tmp << 1; // 等同于 tmp = tmp * 2
}

 也就是根据每个字符在子串出现的位置,乘以2的相应次方

 

我采用了“拉链法”(在推荐的资料中有介绍)避免冲突。

因为我用了new申请内存,所以有一些delete操作;不过不用delete也是可以ac的。

建议初始声明的数组不要过大,否则很容易超内存

 

posted @   Emerald  阅读(151)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示