POJ 1200 Crazy Search

来源:互联网 发布:sql截断字符串 编辑:程序博客网 时间:2024/06/03 22:38

题意

给出一个字符串(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

0 0
原创粉丝点击