poj 1200 Crazy Search
http://poj.org/problem?id=1200
字符串搜索,要将字符串之前搜索过的字符串用一个数来映射储存。这里的字符串长达16*10^6,所以不能hash储存,就连下标都不能存下来,所以这里不能用KR算法,因为KR算法要在找到相同以后还要再逐个比较。
这题的数据也比较水,m^n<10^7,所以可以直接开bool数组来记录字符串是否出现!
代码如下:
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相关推荐
- POJ 1200 Crazy Search 查找有多少种不同的子串(hash)
文章目录 1.采用map解题 2.采用hash查找 题目链接: http://poj.org/problem?id=1200 题目大意:给定子串长度,字符中不同字符数量,以及一个字符串,求不同的子串数 ...
- POJ 1200 Crazy Search(RK)
题意 给定一个由NC个字母组成的字符串,求长度为N的不同子串的个数 思路: 由于只有NC个字母,可以将字母编号,0 - NC - 1,转换成数字,就可以将字符串表示成NC进制的数字,这样所有字串代表的 ...
- 【POJ 1200】Crazy Search(将字符映射为数字,将NC进制hash成10进制)
题目链接 题目链接 http://poj.org/problem?id=1200 题意 原字符串有NC个不同字母,统计原字符串长度为N的子字符串个数 解题思路 将字符按ASCII码映射成数字. 将n个 ...
- poj 3378 Crazy Thairs
题意/Description: These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ≤ N ≤ 5 ...
- poj1200 Crazy Search(hash)
题目大意就是将一个字符串分成长度为N的字串.且不同的字符不会超过NC个.问总共有多少个不同的子串. 采用的办法就是以nc作为进制,把一个子串化为这个进制下的数,再用哈希判断.由于题目说长度不会超过16 ...
- POJ_1200 Crazy Search ( Hash映射 )
题目连接 题意 给一个含有nc个不同字母的字符串,然后求其中有多少个长度为n的不同子串. 题解 因为题目中给出了nc,即字母种类的个数.所以可以把每一个出现的字母对应为1到nc.然后把长度为n的字符串 ...
- POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)
本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...
- Linux里怎么进行路由跟踪,[Linux] traceroute 路由跟踪指令用例
traceroute是用来跟踪数据包到达网络主机所经过的路由工具.在Linux系统中,称之为traceroute,在Windows中称为tracert. 一条路径上的每个设备traceroute要测3 ...
- 本周题解(9.12)
例题 POJ 1200 Crazy Search 解题思路: 将N个字符串分别转换成数字 然后按照 NC进制转换为 10进制 然后开一个标记数组进行标记(判定唯一性) 这样大大缩短了 时间 1600万 ...
最新文章
- From 《visual C++ 6.0开发工具与调试》
- docker常用命令行集锦
- UVALive 5903 Piece it together(二分图匹配)
- Strange Shuffle CodeForces - 1471E(交互题)
- 史上最可爱的关系抽取指南?从一条规则到十个开源项目
- 怎么打包图片_怎么将许多张照片打包发到邮箱?
- T-SQL: 17 个与日期时间相关的自定义函数(UDF),周日作为周的最后一天,均不受 @@DateFirst、语言版本影响!...
- ubuntu16.04安装百度网盘(使用deepin-wine)2019年3月亲测可用以及安装MATLAB的技巧
- 通过phpmyadmin确认此版本的php支持mssql函数,Php5.6.4+IIS8.5+mysql5.6.22+phpmyadmin4.3.6的配置...
- 前端中LED字体的实现
- 啊哈 c语言pdf百度云,啊哈c语言完整版
- java 拼音模糊查询_java 编写模糊查询
- Segmentree beats!---吉如一线段树学习笔记
- C++关于头文件中定义变量出现LNK2005
- 互联网大数据项目汇报计划书PPT模板
- 3D全景图php代码,HTML5 Canvas实现360度全景图的示例代码
- JS之删除数组中的元素
- js从服务器获取word文档,javascript - 使用Office.js API将Word文档(.docx)保存到后端服务器 - 堆栈内存溢出...
- 最新综述 | 皮层内外无线神经信号记录系统为脑机接口技术注入全新血液
- 映射网络驱动器命令(转载)
热门文章
- python操作excel-自动化办公:python 操作Excel
- 怎么知道python有哪些库、哪些方法-哪些 Python 库让你相见恨晚?
- python经典好书-新手Python入门经典书籍推荐
- 学python的好处-学习python有什么好处?python强大之处在哪?
- 零基础可以学python吗-零基础适合学习python吗?
- python爬虫入门教程-Python 爬虫介绍
- python官网下载步骤2019-Python IDE开发工具下载
- python语言能干什么-学Python语言可以做什么?
- 为什么黑客用python-为什么如此多的黑客都用python?
- python语言介绍-00-python语言介绍