POJ 1200 Crazy Search

题意

给出一个字符串( s ),并且给出字符串中有多少种字符(NC)。另给一个长度 N ,问 s 有多少长度为 N 而且两两不同的子串。

输入

N,NC,s

输出

保证结果不大于 1.6×107

思路

这个题几乎所有的数据都没给范围,让我头疼不已。

首先我们要多次比较字符串,所以我们对字符串进行多项式哈希:

hshstringi=hshstringi1SEED+si

这样之后就可以快速得到任意子串的哈希值。现在问题变成了多个整数中有多少是不重复的。用树类的数据结构在这个题的数据强度下是不可行的(理由是我自己没弄过去);所以这个问题又要使用哈希表。

于是这样哈希啊哈希就可以(艰难地)通过这个题目了。最后我开了大约 107 大小的哈希表。

不过就在写这篇博客的时候,我突然想到,这个题目拟要使用的哈希值其实就在 O(N) 的数量里面,对字符串用多项式哈希好像有点浪费。所以如果换一种好一点的哈希方法说不定能更轻松?

代码:https://code.csdn.net/snippets/1584126/master/poj1200.cpp/raw

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值