[poj1200]Crazy Search(hash)
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 26713 | Accepted: 7449 |
Description
Your task is to write a program that given the size, N, of the substring, the number of different characters that may occur in the text, NC, and the text itself, determines the number of different substrings of size N that appear in the text.
As an example, consider N=3, NC=4 and the text "daababac". The different substrings of size 3 that can be found in this text are: "daa"; "aab"; "aba"; "bab"; "bac". Therefore, the answer should be 5.
Input
Output
Sample Input
3 4 daababac
Sample Output
5
Hint
(养成翻译的好习惯)给定字符串,其中字符集大小不超过nc,求其中长度为n的不同的子串个数
第一不要dp做多了把子串看成不连续的
子串就是源字符串连续的子序列!这点看题解才发现……想了半天也想不出来
接下来就好办多了,枚举每一位即可
但问题又来了,如何去重?kmp不行,ac自动机没试过不会,但目测仍然超时
接下来由rk-hash实力打脸kmp!
o(len)的速度没的说,而且已知hash值的话只用o(1)就能办到
rk-hash是什么?把字符串看成一个整数的高精度即可(请自行百度)
但算出哈希还不够,hash值应该会很大,所以要再用一次哈希,模一个素数,模拟链表处理冲突
这样大概空间时间就差不多了
但!but!
“字符集大小”并不意味着按照abcde的顺序给出!
所以单个字符对应的hash值还得自己做出来(具体看代码)
1 //子串还必须是连续的(不然无解了)
2 #include<stdio.h>
3 #include<stdlib.h>
4 #include<string.h>
5 int base,len;
6 const int mod=;
7 char read[];
8 int ex[]={};//单个字符值
9 int hash[mod+][]={{}};
int get(int pos){
int ans=;
for(int i=pos;i<pos+len;i++){
ans*=base;
ans+=ex[read[i]];
}
int tmp=ans%mod;
if(hash[tmp][])for(int i=;i<=hash[tmp][];i++)if(hash[tmp][i]==ans)return ;
hash[tmp][]++;
hash[tmp][hash[tmp][]]=ans;
return ;
}
int main(){
scanf("%d %d\n%s",&len,&base,read);
int le=strlen(read);
for(int i=,j=;i<le;i++){
if(!ex[read[i]])ex[read[i]]=++j;
if(j==base)break;//很简洁地处理字符对应关系
}
int ans=;
for(int i=;i<=le-len;i++)ans+=get(i);
printf("%d\n",ans);
return ;
33 }
[poj1200]Crazy Search(hash)的更多相关文章
- POJ-1200 Crazy Search,人生第一道hash题!
Crazy Search 真是不容易啊,人生第一道hash题竟然是搜博客看题解来的. 题意:给你 ...
- POJ1200 Crazy Search
Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Description Many peo ...
- poj 1200 Crazy Search(hash)
题目链接:http://poj.org/problem?id=1200 思路分析:从数据来看,该题目使用线性时间算法,可见子串的比较是不可能的:使用hash可以在常数时间内查找,可以常数时间内判重, ...
- hdu1381 Crazy Search(hash map)
题目意思: 给出一个字符串和字串的长度,求出该字符串的全部给定长度的字串的个数(不同样). 题目分析: 此题为简单的字符串哈hash map问题,能够直接调用STL里的map类. map<str ...
- POJ1200 A - Crazy Search(哈希)
A - Crazy Search Many people like to solve hard puzzles some of which may lead them to madness. One ...
- hdu 1381 Crazy Search
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1381 Crazy Search Description Many people like to sol ...
- (map string)Crazy Search hdu1381
Crazy Search Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- POJ 1200:Crazy Search(哈希)
Crazy Search Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 32483 Accepted: 8947 Des ...
- Crazy Search POJ - 1200 (字符串哈希hash)
Many people like to solve hard puzzles some of which may lead them to madness. One such puzzle could ...
随机推荐
- C#常用命名空间
MSDN上的C#.NET Framework类库文档目录树,本人觉得有点不得要领,于是参考搜到的结果简单整理如下: 一.基础命名空间 System 处理内建数据.数学计算.随机数的产生.环境变量.垃圾 ...
- 【转】Unity中添加组件的几种方法
http://blog.csdn.net/monzart7an/article/details/23199647 一.在编辑器上面添加一个组件.这个不用多说. 二.在脚本中利用AddComponent ...
- 一个关于Delphi XML处理单元的BUG
使用delphi的XML处理单元 XMLDoc XMLIntf 在获取XML文本内容的时候, 高版本的Delphi会丢失编码描述....在D7上却是正常的, 下面是测试源码: procedure TF ...
- 代理传值Delegate
代理方法中加入参数:[delegate passMeToOther:(id)self]:把自己传给别人.
- 《Linux内核分析》第三周 构建一个简单的Linux系统MenuOS
[刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK THREE ...
- substr mb_substr mbstrct 的用法区别
1.substr遇到中文会出问题,用于截取英文字符 2.mb_substr() 按字符截取字符串,需要开启php_mbstring.dll <?php echo mb_substr(, , 'u ...
- 基于netty的心跳机制实现
前言:在实现过程查找过许多资料,各种波折,最后综合多篇文章最终实现并上线使用.为了减少大家踩坑的时间,所以写了本文,希望有用.对于实现过程中有用的参考资料直接放上链接,可能有些内容相对冗余,不过时间允 ...
- Python开发【第二章】:Python深浅拷贝剖析
Python深浅拷贝剖析 Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 一.对象赋值 ...
- UIWebView中Html中用JS调用OC方法及OC执行JS代码
HTML代码: <html> <head> <title>HTML中用JS调用OC方法</title> <meta http-equiv=&quo ...
- MVC 使用entity framework 访问数据库 发布IIS
1. SQL SERVER 数据库内容 2. MVC工程 3. EF 参考 工程架构: 对应实体类: public class MvcUser { public int Id { get; set; ...