http://poj.org/problem?id=1200

  字符串搜索,要将字符串之前搜索过的字符串用一个数来映射储存。这里的字符串长达16*10^6,所以不能hash储存,就连下标都不能存下来,所以这里不能用KR算法,因为KR算法要在找到相同以后还要再逐个比较。

  这题的数据也比较水,m^n<10^7,所以可以直接开bool数组来记录字符串是否出现!

代码如下:

View Code

 1 #include <cstring>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <algorithm>
 5
 6 using namespace std;
 7
 8 typedef long long ll;
 9 const int maxn = 16000027;
10 bool vis[maxn >> 1];
11 char hash[128];
12 char buf[maxn];
13
14 int deal(int n, int m) {
15     int len = strlen(buf);
16     int cnt = 0;
17     char c;
18
19     if (len < n) return 0;
20     memset(hash, -1, sizeof(hash));
21     //memset(vis, false, sizeof(vis));
22
23     int hi = 1, cur = 0;
24     int ret = 0;
25
26     for (int i = 1; i < n; i++) {
27         hi *= m;
28     }
29     for (int i = 0; i < n - 1; i++) {
30         c = buf[i];
31
32         if (hash[c] == -1) hash[c] = cnt++;
33         cur = cur * m + hash[c];
34     }
35     for (int i = n - 1; i < len; i++) {
36         c = buf[i];
37
38         if (hash[c] == -1) hash[c] = cnt++;
39         cur = cur * m + hash[c];
40 //        cout << cur << endl;
41         if (!vis[cur]) vis[cur] = true, ret++;
42         cur -= hash[buf[i - n + 1]] * hi;
43     }
44
45     return ret;
46 }
47
48
49 int main() {
50     int n, m;
51
52     while (~scanf("%d%d", &n, &m)) {
53         scanf("%s", buf);
54         printf("%d\n", deal(n, m));
55     }
56
57     return 0;
58 }

——written by Lyon

转载于:https://www.cnblogs.com/LyonLys/archive/2012/09/28/poj_1200_Lyon.html

poj 1200 Crazy Search相关推荐

  1. POJ 1200 Crazy Search 查找有多少种不同的子串(hash)

    文章目录 1.采用map解题 2.采用hash查找 题目链接: http://poj.org/problem?id=1200 题目大意:给定子串长度,字符中不同字符数量,以及一个字符串,求不同的子串数 ...

  2. POJ 1200 Crazy Search(RK)

    题意 给定一个由NC个字母组成的字符串,求长度为N的不同子串的个数 思路: 由于只有NC个字母,可以将字母编号,0 - NC - 1,转换成数字,就可以将字符串表示成NC进制的数字,这样所有字串代表的 ...

  3. 【POJ 1200】Crazy Search(将字符映射为数字,将NC进制hash成10进制)

    题目链接 题目链接 http://poj.org/problem?id=1200 题意 原字符串有NC个不同字母,统计原字符串长度为N的子字符串个数 解题思路 将字符按ASCII码映射成数字. 将n个 ...

  4. poj 3378 Crazy Thairs

    题意/Description:     These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ≤ N ≤ 5 ...

  5. poj1200 Crazy Search(hash)

    题目大意就是将一个字符串分成长度为N的字串.且不同的字符不会超过NC个.问总共有多少个不同的子串. 采用的办法就是以nc作为进制,把一个子串化为这个进制下的数,再用哈希判断.由于题目说长度不会超过16 ...

  6. POJ_1200 Crazy Search ( Hash映射 )

    题目连接 题意 给一个含有nc个不同字母的字符串,然后求其中有多少个长度为n的不同子串. 题解 因为题目中给出了nc,即字母种类的个数.所以可以把每一个出现的字母对应为1到nc.然后把长度为n的字符串 ...

  7. POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)

    本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...

  8. Linux里怎么进行路由跟踪,[Linux] traceroute 路由跟踪指令用例

    traceroute是用来跟踪数据包到达网络主机所经过的路由工具.在Linux系统中,称之为traceroute,在Windows中称为tracert. 一条路径上的每个设备traceroute要测3 ...

  9. 本周题解(9.12)

    例题 POJ 1200 Crazy Search 解题思路: 将N个字符串分别转换成数字 然后按照 NC进制转换为 10进制 然后开一个标记数组进行标记(判定唯一性) 这样大大缩短了 时间 1600万 ...

最新文章

  1. From 《visual C++ 6.0开发工具与调试》
  2. docker常用命令行集锦
  3. UVALive 5903 Piece it together(二分图匹配)
  4. Strange Shuffle CodeForces - 1471E(交互题)
  5. 史上最可爱的关系抽取指南?从一条规则到十个开源项目
  6. 怎么打包图片_怎么将许多张照片打包发到邮箱?
  7. T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响!...
  8. ubuntu16.04安装百度网盘(使用deepin-wine)2019年3月亲测可用以及安装MATLAB的技巧
  9. 通过phpmyadmin确认此版本的php支持mssql函数,Php5.6.4+IIS8.5+mysql5.6.22+phpmyadmin4.3.6的配置...
  10. 前端中LED字体的实现
  11. 啊哈 c语言pdf百度云,啊哈c语言完整版
  12. java 拼音模糊查询_java 编写模糊查询
  13. Segmentree beats!---吉如一线段树学习笔记
  14. C++关于头文件中定义变量出现LNK2005
  15. 互联网大数据项目汇报计划书PPT模板
  16. 3D全景图php代码,HTML5 Canvas实现360度全景图的示例代码
  17. JS之删除数组中的元素
  18. js从服务器获取word文档,javascript - 使用Office.js API将Word文档(.docx)保存到后端服务器 - 堆栈内存溢出...
  19. 最新综述 | 皮层内外无线神经信号记录系统为脑机接口技术注入全新血液
  20. 映射网络驱动器命令(转载)

热门文章

  1. python操作excel-自动化办公:python 操作Excel
  2. 怎么知道python有哪些库、哪些方法-哪些 Python 库让你相见恨晚?
  3. python经典好书-新手Python入门经典书籍推荐
  4. 学python的好处-学习python有什么好处?python强大之处在哪?
  5. 零基础可以学python吗-零基础适合学习python吗?
  6. python爬虫入门教程-Python 爬虫介绍
  7. python官网下载步骤2019-Python IDE开发工具下载
  8. python语言能干什么-学Python语言可以做什么?
  9. 为什么黑客用python-为什么如此多的黑客都用python?
  10. python语言介绍-00-python语言介绍